selectConditionBlock can be a 2-arg block;
authormartin
Thu, 25 Jan 2001 18:35:08 +0100
changeset 1920 e3994a83fb16
parent 1919 26fa92fa9465
child 1921 f3f120d43849
selectConditionBlock can be a 2-arg block; 2nd arg is 'isForAddition' flag
SelectionInListModelView.st
--- a/SelectionInListModelView.st	Tue Jan 23 13:44:26 2001 +0100
+++ b/SelectionInListModelView.st	Thu Jan 25 18:35:08 2001 +0100
@@ -811,7 +811,7 @@
     step := lnNr > clickLine ifTrue:[1] ifFalse:[-1].
 
     clickLine to:lnNr by:step do:[:i|
-        (self canSelectIndex:i) ifTrue:[nsel add:i].
+        ((self isInSelection:i) or:[self canSelectIndex:i forAdd:true]) ifTrue:[nsel add:i].
     ].
     (self selectWithoutScroll:nsel redraw:true) ifFalse:[^ self].
 
@@ -883,20 +883,21 @@
 
     multipleSelectOk ifTrue:[
         sensor ctrlDown ifTrue:[
-            (isInSelection or:[self canSelectIndex:clickLine]) ifTrue:[
+            (isInSelection or:[self canSelectIndex:clickLine forAdd:true]) ifTrue:[
                 self toggleSelection:clickLine.
                 self selectionChanged
             ].
             ^ self
         ].
-        (self canSelectIndex:clickLine) ifFalse:[^ self].
+
+        (self canSelectIndex:clickLine forAdd:sensor shiftDown) ifFalse:[^ self].
 
         (sensor shiftDown and:[(start := self firstInSelection) notNil]) ifTrue:[
             step := clickLine < start ifTrue:[-1] ifFalse:[1].
             nsel := OrderedCollection new.
 
             start to:clickLine by:step do:[:i|
-                (self canSelectIndex:i) ifTrue:[nsel add:i]
+                ((self isInSelection:i) or:[self canSelectIndex:i forAdd:true]) ifTrue:[nsel add:i]
             ].
 
             (self selectWithoutScroll:nsel redraw:true) ifTrue:[
@@ -905,7 +906,7 @@
             ^ self
         ]
     ] ifFalse:[
-        (self canSelectIndex:clickLine) ifFalse:[^ self]
+        (self canSelectIndex:clickLine forAdd:false) ifFalse:[^ self]
     ].
 
     (isInSelection and:[self canDrag]) ifTrue:[
@@ -1044,7 +1045,7 @@
         char  := aCharacter asUppercase.
 
         start to:stop by:aStep do:[:anIndex|
-            (self canSelectIndex:anIndex) ifTrue:[
+            (self canSelectIndex:anIndex forAdd:false) ifTrue:[
                 lbl := self characterSearchItemStringAt:anIndex.
                 lbl notNil ifTrue:[
                     cmp := lbl string at:1 ifAbsent:nil.
@@ -1059,8 +1060,6 @@
         ]
     ].
     ^ 0
-
-
 !
 
 keyPress:aKey x:x y:y
@@ -1068,7 +1067,7 @@
     "
     <resource: #keyboard( #Return #CursorUp #CursorDown )>
 
-    |sensor n size lineNr|
+    |sensor n size lineNr delta|
 
     enabled ifFalse:[
         ^ super keyPress:aKey x:x y:y
@@ -1105,21 +1104,24 @@
         lineNr == 0 ifTrue:[lineNr := size + 1].
         (n := lineNr - n) <= 0 ifTrue:[n := size + n].
         lineNr > size ifTrue:[lineNr := size].
-
-        [self canSelectIndex:n] whileFalse:[
-            (n := n - 1) == 0 ifTrue:[n := size].
-            n == lineNr ifTrue:[^ self]
-        ].
+        delta := -1.
     ] ifFalse:[
         (n := lineNr + n) > size ifTrue:[n := n - size].
 
         lineNr == 0 ifTrue:[lineNr := 1].
+        delta := 1.
+    ].
 
-        [self canSelectIndex:n] whileFalse:[
-            (n := n + 1) > size ifTrue:[n := 1].
-            n == lineNr ifTrue:[^ self]
-        ].
+    "/ TODO: care for shift-Down (add-to-selection)
+    [
+        self canSelectIndex:n forAdd:false
+    ] whileFalse:[
+        n := n + delta.
+        n > size ifTrue:[n := 1].
+        n == 0 ifTrue:[n := size].
+        n == lineNr ifTrue:[^ self]
     ].
+
     self selection:n
 !
 
@@ -1522,10 +1524,21 @@
 canSelectIndex:anIndex
     "return true, if the object identified by its index is selectable
     "
-    |item|
+    ^ self canSelectIndex:anIndex forAdd:false
+!
+
+canSelectIndex:anIndex forAdd:isForAdd
+    "return true, if the object identified by its index is selectable
+    "
+    |item isOk|
 
     selectConditionBlock notNil ifTrue:[
-        (selectConditionBlock value:anIndex) ifFalse:[
+        selectConditionBlock numArgs == 2 ifTrue:[
+            isOk := selectConditionBlock value:anIndex value:isForAdd.
+        ] ifFalse:[
+            isOk := selectConditionBlock value:anIndex.
+        ].
+        isOk ifFalse:[
             ^ false
         ]
     ].
@@ -1659,5 +1672,5 @@
 !SelectionInListModelView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/SelectionInListModelView.st,v 1.43 2001-01-10 13:20:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/SelectionInListModelView.st,v 1.44 2001-01-25 17:35:08 martin Exp $'
 ! !