Tools__TextDiff3Tool.st
branchjv
changeset 12307 d7a3df44366a
parent 12269 79f87eee62e5
child 12317 aac0f12a3327
--- a/Tools__TextDiff3Tool.st	Fri Nov 16 10:56:44 2012 +0000
+++ b/Tools__TextDiff3Tool.st	Fri Nov 30 14:25:59 2012 +0000
@@ -15,14 +15,14 @@
 
 TextDiffTool subclass:#TextDiff3Tool
 	instanceVariableNames:'labelMergedHolder textMergedHolder mergeHolder mergeDataHolder
-		mergeView mergeService'
+		mergeIntervalHolder mergeView mergeService'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Diff'
 !
 
 CodeViewService subclass:#MergeService
-	instanceVariableNames:'dataHolder data sectionInterval'
+	instanceVariableNames:'dataHolder data sectionIntervalHolder'
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:TextDiff3Tool
@@ -212,7 +212,7 @@
           collection: (
            (VariableVerticalPanelSpec
               name: 'DiffAndMergePanel'
-              layout: (LayoutFrame 0 0 0 0 0 1 0 1)
+              layout: (LayoutFrame 0 0 30 0 0 1 0 1)
               component: 
              (SpecCollection
                 collection: (
@@ -249,6 +249,12 @@
               )
               handles: (Any 0.5 1.0)
             )
+           (MenuPanelSpec
+              name: 'ToolBar'
+              layout: (LayoutFrame 0 0 0 0 0 1 30 0)
+              menu: toolbarMenuMerge
+              textDefault: true
+            )
            )
          
         )
@@ -294,7 +300,7 @@
            (LabelSpec
               label: 'Merge'
               name: 'VersionMergeLabel'
-              layout: (LayoutFrame 30 0 5 0 -350 1 0 1)
+              layout: (LayoutFrame 30 0 5 0 157 0 0 1)
               translateLabel: true
               labelChannel: labelMergedHolder
               resizeForLabel: true
@@ -302,54 +308,81 @@
               useDynamicPreferredWidth: true
               usePreferredWidth: true
             )
-           (HorizontalPanelViewSpec
-              name: 'HorizontalPanel1'
-              layout: (LayoutFrame -350 1 0 0 0 1 0 1)
-              horizontalLayout: center
-              verticalLayout: center
-              horizontalSpace: 3
-              verticalSpace: 3
-              component: 
-             (SpecCollection
-                collection: (
-                 (ActionButtonSpec
-                    label: 'Merge'
-                    name: 'MergeAuto'
-                    translateLabel: true
-                    model: doMergeAuto
-                    extent: (Point 80 22)
-                  )
-                 (ActionButtonSpec
-                    label: 'Use Base'
-                    name: 'MergeBase'
-                    translateLabel: true
-                    model: doMergeUsingBase
-                    extent: (Point 80 22)
-                  )
-                 (ActionButtonSpec
-                    label: 'Use A'
-                    name: 'MergeUsingA'
-                    translateLabel: true
-                    model: doMergeUsingA
-                    extent: (Point 80 22)
-                  )
-                 (ActionButtonSpec
-                    label: 'Use B'
-                    name: 'MergeUsingB'
-                    translateLabel: true
-                    model: doMergeUsingB
-                    extent: (Point 80 22)
-                  )
-                 )
-               
-              )
-            )
            )
          
         )
       )
 ! !
 
+!TextDiff3Tool class methodsFor:'menu specs'!
+
+toolbarMenuMerge
+    "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::TextDiff3Tool andSelector:#toolbarMenuMerge
+     (Menu new fromLiteralArrayEncoding:(Tools::TextDiff3Tool toolbarMenuMerge)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(Menu
+        (
+         (MenuItem
+            enabled: canMergeCurrentHolder
+            label: 'Base'
+            itemValue: doMergeGurrentUsingBase
+          )
+         (MenuItem
+            enabled: canMergeCurrentHolder
+            label: 'A'
+            itemValue: doMergeGurrentUsingA
+          )
+         (MenuItem
+            enabled: canMergeCurrentHolder
+            label: 'B'
+            itemValue: doMergeGurrentUsingB
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            label: 'All Base'
+            itemValue: doMergeAllUsingBase
+          )
+         (MenuItem
+            label: 'All A'
+            itemValue: doMergeAllUsingA
+          )
+         (MenuItem
+            label: 'All B'
+            itemValue: doMergeAllUsingB
+          )
+         (MenuItem
+            label: '-'
+          )
+         (MenuItem
+            label: 'Auto Merge'
+            itemValue: doMergeAllAuto
+          )
+         (MenuItem
+            label: 'External Merge'
+            itemValue: doMergeAllExternal
+          )
+         )
+        nil
+        nil
+      )
+
+    "Modified: / 30-11-2012 / 13:53:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !TextDiff3Tool class methodsFor:'plugIn spec'!
 
 aspectSelectors
@@ -370,15 +403,13 @@
         #labelCHolder
         #labelHolder
         #languageHolder
+        #mergeDataHolder
+        #mergeHolder
         #textAHolder
         #textBHolder
         #textCHolder
-
-        #mergeHolder
-        #mergeDataHolder
       ).
 
-    "Modified: / 19-03-2012 / 11:54:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !TextDiff3Tool methodsFor:'accessing'!
@@ -404,55 +435,6 @@
     "Created: / 20-03-2012 / 14:17:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!TextDiff3Tool methodsFor:'actions'!
-
-doMergeAuto
-
-    self mergeDataHolder value 
-        text1: self textC text2: self textA text3: self textB.
-
-    "Created: / 17-03-2012 / 12:55:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-doMergeUsingA
-
-    | interval |
-    interval := mergeService sectionInterval.
-    interval notNil ifTrue:[
-        self mergeData mergeUsingA: self textA interval: interval
-    ] ifFalse:[
-        self mergeData mergeUsingA: self textA
-    ]
-
-    "Created: / 17-03-2012 / 12:55:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-doMergeUsingB
-
-    | interval |
-    interval := mergeService sectionInterval.
-    interval notNil ifTrue:[
-        self mergeData mergeUsingB: self textB interval: interval
-    ] ifFalse:[
-        self mergeData mergeUsingB: self textA
-    ]
-
-    "Created: / 17-03-2012 / 12:55:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-doMergeUsingBase
-
-    | interval |
-    interval := mergeService sectionInterval.
-    interval notNil ifTrue:[
-        self mergeData mergeUsingBase: self textC interval: interval
-    ] ifFalse:[
-        self mergeData mergeUsingBase: self textC
-    ]
-
-    "Created: / 17-03-2012 / 12:55:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
 !TextDiff3Tool methodsFor:'aspects'!
 
 mergeDataHolder
@@ -513,6 +495,47 @@
     oldValue ~~ newValue ifTrue:[
         self update:#value with:newValue from:mergeHolder.
     ].
+!
+
+mergeIntervalHolder
+    "return/create the 'mergeIntervalHolder' value holder (automatically generated)"
+
+    mergeIntervalHolder isNil ifTrue:[
+        mergeIntervalHolder := ValueHolder new.
+        mergeIntervalHolder addDependent:self.
+    ].
+    ^ mergeIntervalHolder
+!
+
+mergeIntervalHolder:something
+    "set the 'mergeIntervalHolder' value holder (automatically generated)"
+
+    |oldValue newValue|
+
+    mergeIntervalHolder notNil ifTrue:[
+        oldValue := mergeIntervalHolder value.
+        mergeIntervalHolder removeDependent:self.
+    ].
+    mergeIntervalHolder := something.
+    mergeIntervalHolder notNil ifTrue:[
+        mergeIntervalHolder addDependent:self.
+    ].
+    newValue := mergeIntervalHolder value.
+    oldValue ~~ newValue ifTrue:[
+        self update:#value with:newValue from:mergeIntervalHolder.
+    ].
+! !
+
+!TextDiff3Tool methodsFor:'aspects - queries'!
+
+canMergeCurrentHolder
+    ^self builder bindings at:#canMergeCurrentHolder ifAbsentPut:[
+        BlockValue
+            with:[:model|model value notNil]
+            argument: self mergeIntervalHolder
+    ]
+
+    "Created: / 30-11-2012 / 13:49:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !TextDiff3Tool methodsFor:'aspects-versions'!
@@ -662,10 +685,111 @@
     mergeView registerService: 
                 ((mergeService := MergeService new)
                     dataHolder: self mergeDataHolder;
+                    sectionIntervalHolder: self mergeIntervalHolder;
                     yourself).
     self updateCodeViewSynchronization.
 
     "Created: / 19-03-2012 / 11:47:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-11-2012 / 13:47:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!TextDiff3Tool methodsFor:'menu actions'!
+
+doMergeAllAuto
+    self mergeDataHolder value 
+        text1:self textC
+        text2:self textA
+        text3:self textB.
+
+    "Created: / 17-03-2012 / 12:55:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doMergeAllExternal
+    | left wc right merge |
+
+    left := Filename newTemporary.
+    left writingFileDo:[:s|s nextPutAll: self textC].
+
+    wc := Filename newTemporary.
+    wc writingFileDo:[:s|s nextPutAll: self textA].
+
+    right := Filename newTemporary.
+    right writingFileDo:[:s|s nextPutAll: self textB].
+
+    merge := Filename newTemporary.
+
+    [
+        (OperatingSystem executeCommand:
+                ('%1 %2 %3 %4 -o %5'
+                    bindWith: 'kdiff3'
+                        with: left pathName
+                        with: wc pathName
+                        with: right pathName
+                        with: merge pathName)) ifTrue:[
+            merge exists ifTrue:[
+                self mergeData mergeUsing: merge contents asString
+            ].
+        ]
+    ] ensure:[
+        left remove.
+        wc remove.
+        right remove.
+        merge exists ifTrue:[merge remove].
+    ]
+
+    "Modified: / 30-11-2012 / 14:13:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doMergeAllUsingA
+    self mergeData mergeUsingA: self textA
+
+    "Created: / 30-11-2012 / 13:33:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doMergeAllUsingB
+
+    self mergeData mergeUsingB: self textB
+
+    "Created: / 30-11-2012 / 13:33:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doMergeAllUsingBase
+    self mergeData mergeUsingBase: self textC
+
+    "Created: / 30-11-2012 / 13:33:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doMergeCurrentUsingA
+
+    | interval |
+    interval := mergeService sectionInterval.
+    interval notNil ifTrue:[
+        self mergeData mergeUsingA: self textA interval: interval
+    ]
+
+    "Created: / 30-11-2012 / 13:33:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doMergeCurrentUsingB
+
+    | interval |
+    interval := mergeService sectionInterval.
+    interval notNil ifTrue:[
+        self mergeData mergeUsingB: self textB interval: interval
+    ]
+
+    "Created: / 30-11-2012 / 13:33:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doMergeCurrentUsingBase
+
+    | interval |
+    interval := mergeService sectionInterval.
+    interval notNil ifTrue:[
+        self mergeData mergeUsingBase: self textC interval: interval
+    ]
+
+    "Created: / 30-11-2012 / 13:34:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !TextDiff3Tool methodsFor:'testing'!
@@ -716,7 +840,15 @@
 !
 
 sectionInterval
-    ^ sectionInterval
+    ^ sectionIntervalHolder value
+
+    "Modified: / 30-11-2012 / 13:45:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+sectionInterval: anObject
+    ^ sectionIntervalHolder value: anObject
+
+    "Created: / 30-11-2012 / 13:45:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !TextDiff3Tool::MergeService methodsFor:'aspects'!
@@ -748,6 +880,35 @@
     oldValue ~~ newValue ifTrue:[
         self update:#value with:newValue from:dataHolder.
     ].
+!
+
+sectionIntervalHolder
+    "return/create the 'sectionIntervalHolder' value holder (automatically generated)"
+
+    sectionIntervalHolder isNil ifTrue:[
+        sectionIntervalHolder := ValueHolder new.
+        sectionIntervalHolder addDependent:self.
+    ].
+    ^ sectionIntervalHolder
+!
+
+sectionIntervalHolder:something
+    "set the 'sectionIntervalHolder' value holder (automatically generated)"
+
+    |oldValue newValue|
+
+    sectionIntervalHolder notNil ifTrue:[
+        oldValue := sectionIntervalHolder value.
+        sectionIntervalHolder removeDependent:self.
+    ].
+    sectionIntervalHolder := something.
+    sectionIntervalHolder notNil ifTrue:[
+        sectionIntervalHolder addDependent:self.
+    ].
+    newValue := sectionIntervalHolder value.
+    oldValue ~~ newValue ifTrue:[
+        self update:#value with:newValue from:sectionIntervalHolder.
+    ].
 ! !
 
 !TextDiff3Tool::MergeService methodsFor:'change & update'!
@@ -787,10 +948,11 @@
     data notNil ifTrue:[
         data addDependent: self.
     ].
-    sectionInterval := nil.
+    self sectionInterval: nil.
     self dataChanged
 
     "Created: / 19-03-2012 / 11:56:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-11-2012 / 13:46:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 update:something with:aParameter from:changedObject
@@ -806,9 +968,14 @@
          self dataChanged.
          ^ self.
     ].
+
+    changedObject == sectionIntervalHolder ifTrue:[
+        gutterView invalidate.
+        ^self
+    ].
     super update:something with:aParameter from:changedObject
 
-    "Modified: / 19-03-2012 / 12:41:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-11-2012 / 13:45:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateSelection: lineNr
@@ -819,7 +986,7 @@
         conflict := (self infoAtLine: lineNr) conflict.
     ].
     lineNr isNil"conflict isNil" ifTrue:[
-        sectionInterval := nil
+        self sectionInterval: nil
     ] ifFalse:[
         | start stop i |
         i := lineNr - 1.
@@ -830,11 +997,12 @@
         [ i < (data listInfos size)  and:[ (self infoAtLine: i) conflict == conflict ]] 
             whileTrue:[ i := i + 1 ].
         stop := i - 1.
-        sectionInterval := start to: stop.
+        self sectionInterval: (start to: stop).
     ].
     gutterView invalidate.
 
     "Created: / 03-04-2012 / 19:29:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-11-2012 / 13:45:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !TextDiff3Tool::MergeService methodsFor:'drawing'!
@@ -845,8 +1013,9 @@
      Ask JV what the args means if unsure (I'm lazy to document
      them, now it is just an experiment...)"
 
-    | info color |
+    | info color sectionInterval |
 
+    sectionInterval := self sectionInterval.
     view == gutterView ifFalse:[ ^ self ].
     info := self infoAtLine: lineNo.
     info notNil ifTrue:[ 
@@ -868,6 +1037,7 @@
     ]
 
     "Created: / 19-03-2012 / 13:15:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-11-2012 / 13:46:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !TextDiff3Tool::MergeService methodsFor:'event handling'!
@@ -918,5 +1088,5 @@
 !TextDiff3Tool class methodsFor:'documentation'!
 
 version_SVN
-    ^ '$Id: Tools__TextDiff3Tool.st 8027 2012-07-26 18:46:57Z vranyj1 $'
+    ^ '$Id: Tools__TextDiff3Tool.st 8073 2012-11-30 14:25:59Z vranyj1 $'
 ! !