--- /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$'
+! !
+