Tools__ChangeSetDiffTool.st
branchjv
changeset 12321 13d791d84a47
parent 12320 5b4ec70d83c1
child 12322 6ca193e20c8e
--- a/Tools__ChangeSetDiffTool.st	Thu Jan 17 17:16:17 2013 +0000
+++ b/Tools__ChangeSetDiffTool.st	Thu Jan 17 21:52:18 2013 +0000
@@ -33,11 +33,13 @@
 		navigatorPanelSpecHolder diffMenuHolder diffsetHolderPrivate
 		selectionHolder versionATextHolder versionBTextHolder
 		versionBaseTextHolder textDiffToolHolder
-		textDiffToolWindowSpecHolder mergeHolder mergeDataHolder
-		showVersionMethodDiffsHolder showCopyrightMethodDiffsHolder
-		highlightConflictsHolder hasDiffsetHolder mergeSavedHolder list1
-		list2'
-	classVariableNames:'LastDiffInfo'
+		textDiffToolWindowSpecHolder mergeHolder mergeData
+		mergeDataHolder showVersionMethodDiffsHolder
+		showCopyrightMethodDiffsHolder highlightConflictsHolder
+		hasDiffsetHolder mergeSavedHolder canSaveHolder
+		autoMoveToNextConflictHolder textDiff2App textDiff3App list1App
+		list2App alreadyWarnedAboutUnsavedMerge'
+	classVariableNames:'LastDiffInfo AutoMoveToNextConflict'
 	poolDictionaries:''
 	category:'Interface-Diff'
 !
@@ -141,6 +143,20 @@
 "
 ! !
 
+!ChangeSetDiffTool class methodsFor:'accessing'!
+
+autoMoveToNextConflict
+    ^AutoMoveToNextConflict == true
+
+    "Created: / 17-01-2013 / 19:49:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+autoMoveToNextConflict: aBoolean
+    AutoMoveToNextConflict := aBoolean
+
+    "Created: / 17-01-2013 / 19:49:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !ChangeSetDiffTool class methodsFor:'accessing - defaults'!
 
 versionAColor
@@ -496,39 +512,49 @@
               clientKey: infoPanel
               createNewBuilder: false
             )
-           (UISubSpecification
-              name: 'Label'
-              layout: (LayoutFrame 0 0 30 0 0 1 86 0)
-              initiallyInvisible: true
-              visibilityChannel: hasDiffsetHolder
-              minorKey: labelSpec
-            )
-           (VariableVerticalPanelSpec
-              name: 'Panel'
-              layout: (LayoutFrame 0 0 86 0 0 1 0 1)
-              initiallyInvisible: true
-              visibilityChannel: hasDiffsetHolder
-              showHandle: true
+           (ViewSpec
+              name: 'Content'
+              layout: (LayoutFrame 0 0 30 0 0 1 0 1)
               component: 
              (SpecCollection
                 collection: (
-                 (SubCanvasSpec
-                    name: 'NavigatorPanel'
-                    hasHorizontalScrollBar: false
-                    hasVerticalScrollBar: false
-                    specHolder: navigatorPanelSpecHolder
-                    createNewBuilder: false
+                 (UISubSpecification
+                    name: 'Label'
+                    layout: (LayoutFrame 0 0 0 0 0 1 56 0)
+                    initiallyInvisible: true
+                    visibilityChannel: hasDiffsetHolder
+                    minorKey: labelSpec
                   )
-                 (SubCanvasSpec
-                    name: 'SubCanvas1'
-                    specHolder: textDiffToolWindowSpecHolder
-                    clientHolder: textDiffToolHolder
-                    createNewBuilder: false
+                 (VariableVerticalPanelSpec
+                    name: 'Panel'
+                    layout: (LayoutFrame 0 0 56 0 0 1 0 1)
+                    initiallyInvisible: true
+                    visibilityChannel: hasDiffsetHolder
+                    showHandle: true
+                    component: 
+                   (SpecCollection
+                      collection: (
+                       (SubCanvasSpec
+                          name: 'NavigatorPanel'
+                          hasHorizontalScrollBar: false
+                          hasVerticalScrollBar: false
+                          specHolder: navigatorPanelSpecHolder
+                          createNewBuilder: false
+                        )
+                       (SubCanvasSpec
+                          name: 'SubCanvas1'
+                          specHolder: textDiffToolWindowSpecHolder
+                          clientHolder: textDiffToolHolder
+                          createNewBuilder: false
+                        )
+                       )
+                     
+                    )
+                    handles: (Any 0.5 1.0)
                   )
                  )
                
               )
-              handles: (Any 0.3 1.0)
             )
            )
          
@@ -773,19 +799,19 @@
             enabled: hasSelection
             label: 'Merge using A'
             itemValue: listMenuMergeUsingA
-            shortcutKey: Ctrl2
+            shortcutKey: Cmd2
           )
          (MenuItem
             enabled: hasSelection
             label: 'Merge using B'
             itemValue: listMenuMergeUsingB
-            shortcutKey: Ctrl3
+            shortcutKey: Cmd3
           )
          (MenuItem
             enabled: hasSelection
             label: 'Merge using Base'
             itemValue: listMenuMergeUsingBase
-            shortcutKey: Ctrl1
+            shortcutKey: Cmd1
           )
          (MenuItem
             label: '-'
@@ -917,6 +943,46 @@
             )
           )
          (MenuItem
+            label: 'Movement'
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  label: 'Go to Previous Delta'
+                  itemValue: menuMoveUp
+                )
+               (MenuItem
+                  label: 'Go To Next Delta'
+                  itemValue: menuMoveDown
+                )
+               (MenuItem
+                  label: 'Go to Previous Conflict'
+                  itemValue: menuMoveUpConflict
+                  shortcutKey: AltUp
+                )
+               (MenuItem
+                  label: 'Go to Previous Conflict'
+                  itemValue: menuMoveUpConflict
+                  shortcutKey: CmdCursorUp
+                )
+               (MenuItem
+                  label: 'Go to Next Conflict'
+                  itemValue: menuMoveDownConflict
+                  shortcutKey: CmdCursorDown
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Automatically Go to Next Conflict'
+                  indication: autoMoveToNextConflictHolder
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
             label: 'Change'
             submenuChannel: listMenu
           )
@@ -973,7 +1039,7 @@
             labelImage: (ResourceRetriever ToolbarIconLibrary loadFromFile22x22Icon)
           )
          (MenuItem
-            enabled: canSave
+            enabled: canSaveHolder
             label: 'Save'
             itemValue: fileMenuSave
             isButton: true
@@ -983,25 +1049,25 @@
             label: '-'
           )
          (MenuItem
-            label: 'Move to Previous'
+            label: 'Go to Previous Delta'
             itemValue: menuMoveUp
             isButton: true
             labelImage: (ResourceRetriever ToolbarIconLibrary mergePrev24x24)
           )
          (MenuItem
-            label: 'Move to Next'
+            label: 'Go To Next Delta'
             itemValue: menuMoveDown
             isButton: true
             labelImage: (ResourceRetriever ToolbarIconLibrary mergeNext24x24)
           )
          (MenuItem
-            label: 'Move to Previous Conflict'
+            label: 'Go to Previous Conflict'
             itemValue: menuMoveUpConflict
             isButton: true
             labelImage: (ResourceRetriever ToolbarIconLibrary mergePrevConflict24x24)
           )
          (MenuItem
-            label: 'Move to Next Conflict'
+            label: 'Go to Next Conflict'
             itemValue: menuMoveDownConflict
             isButton: true
             labelImage: (ResourceRetriever ToolbarIconLibrary mergeNextConflict24x24)
@@ -1011,19 +1077,19 @@
           )
          (MenuItem
             label: 'Merge using Base'
-            itemValue: menuMergeUsingBase
+            itemValue: listMenuMergeUsingBase
             isButton: true
             labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingBase24x24)
           )
          (MenuItem
             label: 'Merge using A'
-            itemValue: menuMergeUsingA
+            itemValue: listMenuMergeUsingA
             isButton: true
             labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingA24x24)
           )
          (MenuItem
             label: 'Merge using B'
-            itemValue: menuMergeUsingB
+            itemValue: listMenuMergeUsingB
             isButton: true
             labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingB24x24)
           )
@@ -1031,6 +1097,8 @@
         nil
         nil
       )
+
+    "Modified: / 17-01-2013 / 21:23:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffTool class methodsFor:'plugIn spec'!
@@ -1173,50 +1241,56 @@
 !ChangeSetDiffTool methodsFor:'accessing - subapps'!
 
 list1View: aView
-    list1 := aView application.
+    list1App := aView application.
 
     "Created: / 17-01-2013 / 13:44:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 list2View: aView
-    list2 := aView application.
+    list2App := aView application.
 
     "Created: / 17-01-2013 / 13:44:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 textDiff2Tool
-
-    ^TextDiff2Tool new
-        labelAHolder: self versionALabelHolder;
-         textAHolder: self versionATextHolder;
-
-        labelBHolder: self versionBLabelHolder;
-         textBHolder: self versionBTextHolder;
-
-        yourself
+    textDiff2App isNil ifTrue:[
+        textDiff2App := TextDiff2Tool new
+            labelAHolder: self versionALabelHolder;
+             textAHolder: self versionATextHolder;
+
+            labelBHolder: self versionBLabelHolder;
+             textBHolder: self versionBTextHolder;
+
+            yourself
+    ].
+    ^textDiff2App
 
     "Created: / 16-03-2012 / 13:58:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 20:36:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 textDiff3Tool
-
-    ^TextDiff3Tool new
-        labelCHolder: self versionBaseLabelHolder;
-         textCHolder: self versionBaseTextHolder;
-
-        labelBHolder: self versionBLabelHolder;
-         textBHolder: self versionBTextHolder;
-
-
-        labelAHolder: self versionALabelHolder;
-         textAHolder: self versionATextHolder;
-
-        mergeHolder: self mergeHolder;
-        mergeDataHolder: self mergeDataHolder;
-
-        yourself
+    textDiff3App isNil ifTrue:[
+        textDiff3App := TextDiff3Tool new
+            mergeHolder: self mergeHolder;
+            mergeDataHolder: self mergeDataHolder;
+
+            labelCHolder: self versionBaseLabelHolder;
+             textCHolder: self versionBaseTextHolder;
+
+            labelBHolder: self versionBLabelHolder;
+             textBHolder: self versionBTextHolder;
+
+
+            labelAHolder: self versionALabelHolder;
+             textAHolder: self versionATextHolder;
+
+            yourself
+    ].
+    ^textDiff3App
 
     "Created: / 16-03-2012 / 15:16:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 20:36:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffTool methodsFor:'accessing-menus'!
@@ -1236,17 +1310,17 @@
 
 
     self isOneColumnBrowser ifTrue:[
-        list1 selection: entry
+        list1App selection: entry
     ] ifFalse:[
         | parent |
 
         parent := self diffsetHolderPrivate value diffs 
                     detect:[:each|each diffs includes: entry] ifNone:[nil].
         parent notNil ifTrue:[
-            list1 selection: parent.
-            list1 updateOutputGenerator.
-            list2 updateList.
-            list2 selection: entry.
+            list1App selection: parent.
+            list1App updateOutputGenerator.
+            list2App updateList.
+            list2App selection: entry.
 
         ]
     ]
@@ -1281,6 +1355,28 @@
 
 !ChangeSetDiffTool methodsFor:'aspects'!
 
+autoMoveToNextConflictHolder
+
+    autoMoveToNextConflictHolder isNil ifTrue:[
+        autoMoveToNextConflictHolder := AspectAdaptor forAspect: #autoMoveToNextConflict.
+        autoMoveToNextConflictHolder subject: self class.
+    ].
+    ^autoMoveToNextConflictHolder
+
+    "Created: / 17-01-2013 / 19:51:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+canSaveHolder
+    "return/create the 'canSaveHolder' value holder (automatically generated)"
+
+    canSaveHolder isNil ifTrue:[
+        canSaveHolder := false asValue
+    ].
+    ^ canSaveHolder
+
+    "Modified: / 17-01-2013 / 21:00:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 diffInfoHolder
     "return/create the 'diffInfoHolder' value holder (automatically generated)"
 
@@ -1699,16 +1795,17 @@
     info := self diffInfoHolder value.
     self hasDiffsetHolder value: false.
     self mergeSavedHolder value: false.
+    self canSaveHolder value: false.
     info notNil ifTrue:[
         self infoPanel showProgressLabeled: (resources string:'Reading changesets') while: [
             info read.
             self diffset: info diffset.
             self updateViews.
         ].
-    ]
+    ].
 
     "Created: / 19-03-2012 / 23:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 15-01-2013 / 11:40:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 21:01:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 diffsetChanged
@@ -1722,24 +1819,46 @@
         self beSingleColumn.
     ].
     self hasDiffsetHolder value: ds notNil.
+    self canSaveHolder value: self canSave.
+    alreadyWarnedAboutUnsavedMerge := false.
+
 
     self diffsetHolderPrivate value: 
         (self isOneColumnBrowser 
             ifTrue:[ds flattened sort]
             ifFalse:[ds value sort]).
-
+    self autoMoveToNextConflictHolder value ifTrue:[
+        self menuMoveDownConflict.
+    ].
     self versionALabelHolder value: ds versionALabel.
     self versionBLabelHolder value: ds versionBLabel.
     self versionBaseLabelHolder value: ds versionBaseLabel.
 
     "Created: / 05-12-2009 / 11:03:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 29-06-2011 / 08:24:18 / Jan Vrany <enter your email here>"
-    "Modified: / 17-01-2013 / 13:58:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 21:22:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 mergeDataChanged
+    "Resolution has been changed..."
+
+    self canSaveHolder value: self canSave.
+    alreadyWarnedAboutUnsavedMerge := false.
+    (self autoMoveToNextConflictHolder value and:[mergeData isMerged]) ifTrue:[
+        self menuMoveDownConflict
+    ]
+
+    "Created: / 17-01-2013 / 20:06:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 21:20:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+mergeDataHolderChanged
+    mergeData notNil ifTrue:[mergeData removeDependent: self].
+    mergeData := self mergeDataHolder value.
+    mergeData notNil ifTrue:[mergeData addDependent: self].
 
     "Created: / 16-01-2013 / 09:24:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 20:06:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 selectionChanged
@@ -1792,6 +1911,12 @@
     ].
 
     sender == mergeDataHolder ifTrue:[
+        self mergeDataHolderChanged.
+        ^self.
+    ].
+
+    sender == mergeData ifTrue:[
+        "Resolution has been changed..."    
         self mergeDataChanged.
         ^self.
     ].
@@ -1799,7 +1924,7 @@
     ^super update: aspect with: param from: sender
 
     "Created: / 05-12-2009 / 11:02:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 16-01-2013 / 09:24:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 17-01-2013 / 20:06:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 updateListMenu
@@ -1831,18 +1956,18 @@
     self diffInfo isNil ifTrue:[ ^ self ].
 
     self diffInfo isDiff3 ifTrue:[
+        self mergeHolder value: self diffInfo isMerge.
         self textDiffToolHolder value isDiff3 ifFalse:[
             textDiffToolHolder value: self textDiff3Tool.
         ].
-
     ] ifFalse:[
         self textDiffToolHolder value isDiff2 ifFalse:[
             textDiffToolHolder value: self textDiff2Tool.
         ].
     ].
-    self mergeHolder value: self diffInfo isMerge.
 
     "Created: / 20-03-2012 / 10:21:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 20:16:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffTool methodsFor:'initialization'!
@@ -2139,13 +2264,10 @@
 canSave
     "Returns true, if a merged file can be saved"
 
-    | info |
-    info := self diffInfo.
-    info isNil ifTrue:[^false].
-    ^info isMerge and:[info specMerge isFile and:[info diffset notNil and:[info diffset isMerged]]]
+    ^self canSaveAs and:[self diffInfo specMerge isFile]
 
     "Created: / 20-03-2012 / 15:00:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 17-01-2013 / 12:25:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 21:09:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 canSaveAs
@@ -2154,9 +2276,10 @@
     | info |
     info := self diffInfo.
     info isNil ifTrue:[^false].
-    ^info isMerge and:[info diffset isMerged]
+    ^info isMerge and:[info diffset notNil and:[info diffset isMerged]]
 
     "Created: / 20-03-2012 / 15:03:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 20:57:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 canSaveAsPatch
@@ -2184,6 +2307,30 @@
     "Created: / 03-11-2009 / 10:48:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!ChangeSetDiffTool methodsFor:'startup & release'!
+
+closeRequest
+
+    "/Warn about unsaved merge..."
+    (alreadyWarnedAboutUnsavedMerge not and:[self canSave and:[mergeSavedHolder value not]]) ifTrue:[
+        alreadyWarnedAboutUnsavedMerge := true.
+        self infoPanel 
+            reset;
+            beInformation;
+            message: (self resources string:'Output file (merge) has not been saved. Save?');
+            addButtonWithLabel: (self resources string:'Save') action: [
+                self fileMenuSave.
+                self closeDownViews.
+            ];
+            addButtonWithLabel: (self resources string:'Cancel') action:[self infoPanel hide];
+            show.
+        ^self.
+    ].
+    self closeDownViews.
+
+    "Created: / 17-01-2013 / 21:02:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !ChangeSetDiffTool methodsFor:'testing'!
 
 isDiff2
@@ -3091,5 +3238,5 @@
 !
 
 version_SVN
-    ^ '$Id: Tools__ChangeSetDiffTool.st 8089 2013-01-17 17:16:17Z vranyj1 $'
+    ^ '$Id: Tools__ChangeSetDiffTool.st 8090 2013-01-17 21:52:18Z vranyj1 $'
 ! !