Tools__ChangeSetDiffList.st
branchjv
changeset 12320 5b4ec70d83c1
parent 12317 aac0f12a3327
child 12431 9f0c59c742d5
--- a/Tools__ChangeSetDiffList.st	Wed Jan 16 11:59:55 2013 +0000
+++ b/Tools__ChangeSetDiffList.st	Thu Jan 17 17:16:17 2013 +0000
@@ -28,9 +28,9 @@
 "{ NameSpace: Tools }"
 
 BrowserListWithFilter subclass:#ChangeSetDiffList
-	instanceVariableNames:'listHolder listEntryLabelGenerator listEntryIconGenerator
-		showVersionMethodDiffsHolder showCopyrightMethodDiffsHolder
-		highlightConflictsHolder'
+	instanceVariableNames:'listHolder listSelectionHolder listEntryLabelGenerator
+		listEntryIconGenerator showVersionMethodDiffsHolder
+		showCopyrightMethodDiffsHolder highlightConflictsHolder'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Diff'
@@ -120,7 +120,7 @@
            (SelectionInListModelViewSpec
               name: 'List'
               layout: (LayoutFrame 0 0 0 0 0 1 0 1)
-              model: selectionHolder
+              model: listSelectionHolder
               menu: menuHolderWithShowFilter
               hasHorizontalScrollBar: true
               hasVerticalScrollBar: true
@@ -128,14 +128,13 @@
               multipleSelectOk: true
               useIndex: false
               highlightMode: line
+              ignoreReselect: false
               postBuildCallback: postBuildListView:
             )
            )
          
         )
       )
-
-    "Modified: / 01-08-2012 / 17:31:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffList class methodsFor:'plugIn spec'!
@@ -151,7 +150,7 @@
      these can be connected to aspects of an embedding application
      (if this app is embedded in a subCanvas)."
 
-    ^ super aspectSelectors , #(
+    ^ #(
         #highlightConflictsHolder
         #inGeneratorHolder
         #listEntryIconGenerator
@@ -159,10 +158,10 @@
         #menuHolder
         #outGeneratorHolder
         #showCopyrightMethodDiffsHolder
+        #showFilterHolder
         #showVersionMethodDiffsHolder
       ).
 
-    "Modified (format): / 01-08-2012 / 17:32:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffList methodsFor:'accessing'!
@@ -181,6 +180,14 @@
 
 listEntryLabelGenerator:aBlock
     listEntryLabelGenerator := aBlock.
+!
+
+selection: entry
+    self updateList.
+    self selectionHolder value: (Array with: entry).
+
+    "Created: / 17-01-2013 / 13:41:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 16:37:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffList methodsFor:'aspects'!
@@ -225,6 +232,18 @@
     ^ listHolder
 !
 
+listSelectionHolder
+    "return/create the 'listSelectionHolder' value holder (automatically generated)"
+
+    listSelectionHolder isNil ifTrue:[
+        listSelectionHolder := ValueHolder new.
+        listSelectionHolder addDependent:self.
+    ].
+    ^ listSelectionHolder
+
+    "Modified: / 17-01-2013 / 16:51:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 showCopyrightMethodDiffsHolder
     "return/create the 'showCopyrightMethodDiffsHolder' value holder (automatically generated)"
 
@@ -285,9 +304,66 @@
 
 !ChangeSetDiffList methodsFor:'change & update'!
 
+enqueueDelayedUpdate:something with:aParameter from:changedObject
+    immediateUpdate value ifTrue:[
+        self delayedUpdate:something with:aParameter from:changedObject
+    ] ifFalse:[
+        super enqueueDelayedUpdate:something with:aParameter from:changedObject
+    ]
+
+    "Created: / 17-01-2013 / 16:25:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+enqueueDelayedUpdateList
+    immediateUpdate value ifTrue:[
+        self updateList
+    ] ifFalse:[
+        super enqueueDelayedUpdateList
+    ].
+
+    "Created: / 17-01-2013 / 16:44:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+listSelectionChanged
+    | lsel |
+
+    lsel := listSelectionHolder value ? #().
+    self selectionHolder 
+        removeDependent: self;
+        value: (lsel collect:[:e | e model ]);
+        addDependent: self.
+    self enqueueDelayedUpdateOutputGenerator
+
+    "Created: / 17-01-2013 / 14:26:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 16:23:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+selectionChanged
+    | sel lsel llist |
+
+    listSelectionHolder isNil ifTrue:[ ^ self ].
+
+    listSelectionHolder removeDependent: self.
+    sel := (self selectionHolder value) ? #().
+    llist := self listHolder value.
+    lsel := llist select:[:leach | sel includesIdentical: leach model].
+    listSelectionHolder value: lsel.
+    listSelectionHolder addDependent: self.
+
+    super selectionChanged.
+
+    "Created: / 17-01-2013 / 14:11:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 16:36:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 update: aspect with: param from: sender
 
     aspect == #resolution ifTrue:[^(self componentAt: #List) invalidateRepairNow: true].
+
+    sender == listSelectionHolder ifTrue:[
+        self listSelectionChanged.
+        ^self
+    ].
         
     sender == selectionHolder ifTrue:[
         self selectionChanged.
@@ -314,7 +390,7 @@
 
     super update: aspect with: param from: sender.
 
-    "Modified: / 01-08-2012 / 17:24:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 15:26:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffList methodsFor:'generators'!
@@ -324,9 +400,29 @@
     ^Iterator on:
         [:whatToDo|
         self selectionHolder value do:
-            [:each|each model do: whatToDo]]
+            [:each|each notNil ifTrue:[each do: whatToDo]]]
+
+    "Modified: / 17-01-2013 / 17:12:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ChangeSetDiffList methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
 
-    "Modified: / 26-11-2009 / 17:23:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "/ please change as required (and remove this comment)
+    "/ listHolder := nil.
+    "/ listSelectionHolder := nil.
+    "/ listEntryLabelGenerator := nil.
+    "/ listEntryIconGenerator := nil.
+    "/ showVersionMethodDiffsHolder := nil.
+    "/ showCopyrightMethodDiffsHolder := nil.
+    "/ highlightConflictsHolder := nil.
+
+    super initialize.
+    immediateUpdate := true asValue.
+
+    "Modified: / 17-01-2013 / 16:51:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffList methodsFor:'private'!
@@ -404,8 +500,9 @@
 updateList
     "Superclass Tools::BrowserList says that I am responsible to implement this method"
     
-    | newDiffs newList |
-    self listHolder value ? #() do: [:entry|entry model removeDependent: self].
+    | newDiffs oldList newList anyNew |
+    oldList := self listHolder value ? #().
+    oldList do: [:entry|entry model removeDependent: self].
 
     newDiffs := self inGeneratorHolder value ? #().
     (newDiffs isKindOf: ChangeSetDiffComponent) ifTrue:
@@ -413,18 +510,22 @@
 
     newDiffs := self filterList: newDiffs.
     newList := OrderedCollection new:16.    
-    newDiffs do:
-        [:item|
+    anyNew := false.
+    newDiffs do:[:item|
         (self shouldDisplayDiff: item) ifTrue:[
-            newList add:(ListEntry model: item application: self).
-            item addDependent: self].
+            | entry |
+
+            entry := oldList detect:[:e|e model == entry] ifNone:[anyNew := true. (ListEntry model: item application: self)].
+            newList add:entry.
         ].
-
+    ].
     newList sort:[:a :b|a label < b label].
-    self listHolder value:newList
+    (anyNew or:[oldList size ~~ newList size]) ifTrue:[
+        self listHolder value:newList
+    ].
 
     "Modified: / 07-07-2011 / 14:17:26 / jv"
-    "Modified: / 03-08-2012 / 14:42:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-01-2013 / 16:40:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ChangeSetDiffList::ListEntry class methodsFor:'instance creation'!
@@ -503,5 +604,5 @@
 !
 
 version_SVN
-    ^ '$Id: Tools__ChangeSetDiffList.st 8086 2013-01-15 12:03:21Z vranyj1 $'
+    ^ '$Id: Tools__ChangeSetDiffList.st 8089 2013-01-17 17:16:17Z vranyj1 $'
 ! !