RectanglefromUserController.st
author Claus Gittinger <cg@exept.de>
Tue, 07 Mar 2017 18:23:44 +0100
changeset 6119 ad406347b834
child 6120 37438a85b476
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6119
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2017 by eXept Software AG
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libwidg' }"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ NameSpace: Smalltalk }"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
ButtonController subclass:#RectangleFromUserController
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:'action startPoint lastX lastY'
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	category:'Interface-Support-Controllers'
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!RectangleFromUserController class methodsFor:'documentation'!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
copyright
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
 COPYRIGHT (c) 2017 by eXept Software AG
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
              All Rights Reserved
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 This software is furnished under a license and may be used
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 only in accordance with the terms of that license and with the
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 be provided or otherwise made available to, or used by, any
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 other person.  No title to or ownership of the software is
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 hereby transferred.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
documentation
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    drags a rectangle.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    An instance of me can be installed temporarily as controller of any view,
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    to let the user select a rectangular area from the view.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    Use the utility method:
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
        dragRectangleIn:aView thenDo:action
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    which does exactly that for your (and cares to restore any original controller)    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
examples
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    |v c|
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    v := View new openAndWait.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    c := DragRectangleController new.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    c action:[:rect | Transcript showCR:rect ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    v openAndWait.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    v controller:c.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
! !
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
!RectangleFromUserController class methodsFor:'utilities'!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
dragRectangleIn:aView thenDo:action
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    "drag a rectangle in aView"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    |dragController oldController oldCursor|
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    dragController := DragRectangleController new.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    dragController view:aView.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    oldController := aView controller.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    oldCursor := aView cursor.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    aView cursor:Cursor origin.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    dragController action:[:rectOrNil |
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
        |image|
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
        aView controller:oldController.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
        aView cursor:oldCursor.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
        action value:rectOrNil.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    aView controller:dragController.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
! !
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
!RectangleFromUserController methodsFor:'accessing'!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
action:aBlock
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    "set the block which will be called when the rectangle drag is finished.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
     The block will be called with a nil arg, if escape is pressed"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
     
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    action := aBlock
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
lastMousePoint
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    lastX isNil ifTrue:[^ nil].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    ^ lastX @ lastY
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
startPoint
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    ^ startPoint
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
! !
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
!RectangleFromUserController methodsFor:'event handling'!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
buttonMotion:buttonState x:x y:y
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    (buttonState == 0 or:[startPoint isNil]) ifTrue:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
        super buttonMotion:buttonState x:x y:y.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
        ^ self
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    lastX notNil ifTrue:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
        view xoring:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
            view displayRectangle:(startPoint corner:(lastX@lastY))
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
        ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    lastX := x.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    lastY := y.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    startPoint ~= (x@y) ifTrue:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
        view xoring:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
            view displayRectangle:(startPoint corner:(lastX@lastY))
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
        ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
buttonPress:button x:x y:y
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    startPoint := x@y.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    view cursor:(Cursor corner).
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
buttonRelease:button x:x y:y
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    |rect|
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    startPoint isNil ifTrue:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
        super buttonRelease:button x:x y:y.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
        ^ self
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    (lastX isNil or:[lastY isNil]) ifTrue:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
        lastX := x.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
        lastY := y.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
    view xoring:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
        view displayRectangle:(startPoint corner:(lastX@lastY))
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    rect := startPoint corner:(lastX@lastY).
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    startPoint := lastX := lastY := nil.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    action value:rect.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    "Modified: / 09-02-2017 / 23:18:01 / cg"
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
keyPress:key x:x y:y
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    startPoint isNil ifTrue:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
        super keyPress:key x:x y:y.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
        ^ self
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    lastX notNil ifTrue:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
        view xoring:[
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
            view displayRectangle:(startPoint corner:(lastX@lastY))
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
        ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    ].
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
    startPoint := nil.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    action value:nil.
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
! !
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
!RectangleFromUserController class methodsFor:'documentation'!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
version
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
    ^ '$Header$'
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
!
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
version_CVS
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
    ^ '$Header$'
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
! !
ad406347b834 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184