VariablePanelController.st
changeset 2236 cd77d04c9a0a
parent 2223 75e5e3dc70be
child 2239 31a57c0002a2
--- a/VariablePanelController.st	Wed Aug 23 20:01:26 2000 +0200
+++ b/VariablePanelController.st	Wed Aug 23 22:54:19 2000 +0200
@@ -127,7 +127,7 @@
 buttonPress:button x:bx y:by
     "button was pressed - setup resizing if a handle is hit
     "
-    |handleView hindex|
+    |handleView hindex isMin isMax layout|
 
     ((button == 1) or:[button == #select]) ifFalse:[
           self pointerLeave:0.
@@ -144,6 +144,7 @@
     ) ifFalse:[
         ^ self
     ].
+
     view grabPointerWithCursor:(view cursor).
     handleView := view subViews at:movedHandle.
 
@@ -161,11 +162,19 @@
 
     saveCursor notNil ifTrue:[
         "there is a snap under the cursor; redraw selected"
+        view snapMode == #both ifTrue:[
+            layout := view snapLayoutAt:movedHandle.
+            view orientation == #vertical ifTrue:[
+                isMax := bx > (layout right - (layout width//3)).
+                isMin := bx < (layout left + (layout width//3)).
+            ] ifFalse:[
+                isMax := by > (layout bottom - (layout height//3)).
+                isMin := by < (layout top + (layout height//3)).
+            ].
+            handleView objectAttributeAt:#snapPart  put:(isMin ifTrue:[#left] ifFalse:[ isMax ifTrue:[#right] ifFalse:[#middle]]).
+        ].
         view drawSnapAt:movedHandle
     ]
-
-
-
 !
 
 buttonRelease:button x:bx y:by
@@ -183,14 +192,16 @@
 
     resizeMode notNil ifTrue:[
         resizeMode == #active ifTrue:[
-            aboveView := view subViews at:movedHandle.
-            aboveView objectAttributeAt:#vpext put:(aboveView relativeCorner).
+            (view snapMode == #both) ifFalse:[
+                aboveView := view subViews at:movedHandle.
+                aboveView objectAttributeAt:#vpext put:(aboveView relativeCorner).
+            ].
             self doResize
         ] ifFalse:[
             (    (layout := view snapLayoutAt:movedHandle) notNil
              and:[layout containsPointX:bx y:by]
             ) ifTrue:[
-                self doSnapPressed
+                self doSnapPressedX:bx y:by
             ].
         ].
     ].
@@ -364,26 +375,58 @@
 
 !
 
-doSnapPressed
+doSnapPressedX:x y:y
     "perform the snap press
     "
-    |layout handle curRCorner prvRCorner isVertical newPos mode|
+    |layout handle curRCorner prvRCorner isVertical newPos mode isMax isMin doRememberPosition|
 
     (mode := view snapMode) isNil ifTrue:[^ self].
 
     layout     := view snapLayoutAt:movedHandle.
     handle     := view subViews at:movedHandle.
     isVertical := view orientation == #vertical.
+
     curRCorner := handle relativeCorner.
     prvRCorner := handle objectAttributeAt:#vpext.
 
-    (view snapAtIndexWillGrow:movedHandle) ifFalse:[
-        (prvRCorner isNil or:[mode ~~ #max]) ifTrue:[newPos := 0]            "set extent to min"
-    ] ifTrue:[
-        (prvRCorner isNil or:[mode ~~ #min]) ifTrue:[newPos := 99999]        "set extent to max"
+    isMax := isMin := false.
+    mode == #both ifTrue:[
+        isVertical ifTrue:[
+            isMax := x > (layout right - (layout width//3)).
+            isMin := x < (layout left + (layout width//3)).
+        ] ifFalse:[
+            isMax := y > (layout bottom - (layout height//3)).
+            isMin := y < (layout top + (layout height//3)).
+        ].
+        handle objectAttributeAt:#snapPart  put:(isMin ifTrue:[#left] ifFalse:[ isMax ifTrue:[#right] ifFalse:[#middle]]).
+        doRememberPosition := (isMin or:[isMax]) and:[prvRCorner isNil].
+    ] ifFalse:[
+        isMax := view snapAtIndexWillGrow:movedHandle.
+        isMin := isMax not.
+        isMax ifTrue:[
+           isMax := prvRCorner isNil or:[mode ~~ #min]
+        ] ifFalse:[
+           isMin := prvRCorner isNil or:[mode ~~ #max]
+        ].
+        doRememberPosition := true.
+    ].
+
+    isMax ifTrue:[
+        newPos := 99999        "set extent to max"
+    ] ifFalse:[
+        isMin ifTrue:[
+            newPos := 0        "set extent to min"
+        ] ifFalse:[
+            newPos := nil      "restore previous extent"
+        ]
     ].
 
     newPos isNil ifTrue:[
+        prvRCorner isNil ifTrue:[
+            "/ nothing to do
+            ^ self
+        ].
+
         "restore previous extent"
         newPos := isVertical ifTrue:[view height * prvRCorner y]
                             ifFalse:[view width  * prvRCorner x].
@@ -399,12 +442,20 @@
             ].
             newPos := self checkedHandleMovementX:newPos y:newPos.
         ].
+
+        mode == #both ifTrue:[
+           handle objectAttributeAt:#vpext put:nil.         "clear previous corner"
+           doRememberPosition := false.
+        ].
+
     ] ifFalse:[
         newPos := self checkedHandleMovementX:newPos y:newPos
     ].
 
     (newPos - prevPos) abs < 2 ifFalse:[
-        handle objectAttributeAt:#vpext put:curRCorner.         "save previous corner"
+        doRememberPosition ifTrue:[
+            handle objectAttributeAt:#vpext put:curRCorner.         "save previous corner"
+        ].
         prevPos := newPos.
         self doResize.
     ]
@@ -413,7 +464,7 @@
 !VariablePanelController class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg/VariablePanelController.st,v 1.27 2000-08-19 17:12:59 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg/VariablePanelController.st,v 1.28 2000-08-23 20:54:12 cg Exp $'
 
 
 ! !