initial checkin
authorClaus Gittinger <cg@exept.de>
Tue, 07 Mar 2017 18:31:29 +0100
changeset 6121 7fb5e8886804
parent 6120 37438a85b476
child 6122 5b97a28ad283
initial checkin
PointFromUserController.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PointFromUserController.st	Tue Mar 07 18:31:29 2017 +0100
@@ -0,0 +1,153 @@
+"
+ COPYRIGHT (c) 2017 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+"{ Package: 'stx:libwidg' }"
+
+"{ NameSpace: Smalltalk }"
+
+ButtonController subclass:#PointFromUserController
+	instanceVariableNames:'action pressPoint'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Support-Controllers'
+!
+
+!PointFromUserController class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2017 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+!
+
+documentation
+"
+    drags a rectangle.
+
+    An instance of me can be installed temporarily as controller of any view,
+    to let the user select a rectangular area from the view.
+
+    Use the utility method:
+        dragRectangleIn:aView thenDo:action
+    which does exactly that for your (and cares to restore any original controller)    
+    
+"
+!
+
+examples
+"
+    |v c|
+
+    v := View new openAndWait.
+    c := PointFromuserController new.
+    c action:[:point | Transcript showCR:point ].
+    v openAndWait.
+    
+    v controller:c.
+"
+! !
+
+!PointFromUserController class methodsFor:'utilities'!
+
+pointFromUserIn:aView thenDo:action
+    "wait for a button press in aView"
+    
+    |pickController oldController oldCursor|
+    
+    pickController := self new.
+    pickController view:aView.
+    oldController := aView controller.
+    oldCursor := aView cursor.
+
+    aView cursor:Cursor crossHair.
+    pickController action:[:pointOrNil |
+        |image|
+
+        aView controller:oldController.
+        aView cursor:oldCursor.
+        action value:pointOrNil.
+    ].
+    
+    aView controller:pickController.
+
+    "Created: / 07-03-2017 / 18:29:28 / cg"
+! !
+
+!PointFromUserController methodsFor:'accessing'!
+
+action:aBlock
+    "set the block which will be called when the point has been picked.
+     The block will be called with a nil arg, if escape is pressed"
+     
+    action := aBlock
+
+    "Modified (comment): / 07-03-2017 / 18:26:34 / cg"
+!
+
+pressPoint
+    ^ pressPoint
+
+    "Created: / 07-03-2017 / 18:28:36 / cg"
+! !
+
+!PointFromUserController methodsFor:'event handling'!
+
+buttonPress:button x:x y:y
+    pressPoint := x@y.
+    view cursor:(Cursor normal).
+
+    "Modified: / 07-03-2017 / 18:27:46 / cg"
+!
+
+buttonRelease:button x:x y:y
+    |point|
+    
+    pressPoint isNil ifTrue:[
+        super buttonRelease:button x:x y:y.
+        ^ self
+    ].
+    point := pressPoint.
+    pressPoint := nil.
+    action value:point.
+
+    "Modified: / 07-03-2017 / 18:28:24 / cg"
+!
+
+keyPress:key x:x y:y
+    pressPoint isNil ifTrue:[
+        super keyPress:key x:x y:y.
+        ^ self
+    ].
+
+    pressPoint := nil.
+    action value:nil.
+
+    "Modified: / 07-03-2017 / 18:27:19 / cg"
+! !
+
+!PointFromUserController class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+!
+
+version_CVS
+    ^ '$Header$'
+! !
+