--- 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 $'
! !