HierarchicalDropTargetController.st
author ab
Tue, 25 Mar 2008 11:11:43 +0100
changeset 3371 c80f59a3a422
child 3379 060bb2feff4b
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     1
"{ Package: 'stx:libwidg2' }"
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     2
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     3
Object subclass:#HierarchicalDropTargetController
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     4
	instanceVariableNames:'expandBlock highlightMode receiver dropOverLine dropSelector
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     5
		canDropSelector'
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     6
	classVariableNames:''
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     7
	poolDictionaries:''
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     8
	category:'Interface-DragAndDrop'
c80f59a3a422 initial checkin
ab
parents:
diff changeset
     9
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    10
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    11
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    12
!HierarchicalDropTargetController class methodsFor:'instance creation'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    13
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    14
receiver:aReceiver argument:anArgument dropSelector:aDropSelector canDropSelector:aCanDropSelector
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    15
    |target|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    16
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    17
    target := self new.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    18
    ^ target receiver:aReceiver argument:anArgument dropSelector:aDropSelector canDropSelector:aCanDropSelector
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    19
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    20
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    21
receiver:aReceiver dropSelector:aDropSelector canDropSelector:aCanDropSelector
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    22
    ^ self receiver:aReceiver argument:nil dropSelector:aDropSelector canDropSelector:aCanDropSelector
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    23
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    24
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    25
!HierarchicalDropTargetController class methodsFor:'constants'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    26
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    27
delayMilliSecondsBeforeExpand
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    28
    ^ 1000
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    29
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    30
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    31
!HierarchicalDropTargetController methodsFor:'drop actions'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    32
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    33
canDrop:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    34
    "return true, if the DropContext can be dropped into the list of items"
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    35
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    36
    dropOverLine isNil ifTrue:[ ^ false ].      "/ never setup by dropEnter:
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    37
    dropOverLine > 0 ifFalse:[ ^ false ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    38
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    39
    canDropSelector numArgs == 2 ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    40
        ^ receiver perform:canDropSelector with:aDropContext with:dropOverLine .
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    41
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    42
    ^ receiver perform:canDropSelector with:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    43
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    44
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    45
drop:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    46
    "drop the dropContext into the hierachical list of items
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    47
    "
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    48
    |lnNr|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    49
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    50
    lnNr := dropOverLine.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    51
    lnNr isNil ifTrue:[^ false ].      "/ never setup by dropEnter:
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    52
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    53
    self dropLeave:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    54
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    55
    dropSelector isNil ifTrue:[  ^ false ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    56
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    57
    dropSelector numArgs == 2 ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    58
        receiver perform:dropSelector with:aDropContext with:lnNr .
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    59
    ] ifFalse:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    60
        receiver perform:dropSelector with:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    61
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    62
    ^ true
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    63
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    64
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    65
dropEnter:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    66
    "a drop operation enters my widget; set the highlightMode in the target widget"
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    67
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    68
    |widget|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    69
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    70
    dropOverLine := 0.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    71
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    72
    widget := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    73
    highlightMode := widget highlightMode.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    74
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    75
    highlightMode notNil ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    76
        aDropContext saveDraw:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    77
            widget highlightMode: #dropMode.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    78
            widget windowGroup processExposeEvents.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    79
        ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    80
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    81
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    82
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    83
dropLeave:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    84
    "the widget is leaved; restore drop indications drawn ...
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    85
    "
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    86
    self changeDropLineTo:nil in:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    87
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    88
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    89
dropOver:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    90
    |target lineNr|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    91
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    92
    dropOverLine isNil ifTrue:[^ self ].       "/ never setup by dropEnter:
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    93
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    94
    target := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    95
    lineNr := target yVisibleToLineNr:(aDropContext targetPoint y).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    96
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    97
    lineNr isNil ifTrue:[ lineNr := 0. ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    98
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    99
    lineNr > target size ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   100
        lineNr := 0.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   101
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   102
    self changeDropLineTo:lineNr in:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   103
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   104
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   105
!HierarchicalDropTargetController methodsFor:'instance creation'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   106
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   107
receiver:aReceiver argument:anArgument dropSelector:aDropSelector canDropSelector:aCanDropSelector
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   108
    |target|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   109
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   110
    receiver        := aReceiver.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   111
    dropSelector    := aDropSelector.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   112
    canDropSelector := aCanDropSelector.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   113
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   114
    target := DropTarget
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   115
        receiver:self
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   116
        argument:anArgument
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   117
        dropSelector:#drop:
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   118
        canDropSelector:#canDrop:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   119
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   120
    target enterSelector:#dropEnter:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   121
    target leaveSelector:#dropLeave:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   122
    target overSelector:#dropOver:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   123
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   124
    ^ target
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   125
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   126
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   127
!HierarchicalDropTargetController methodsFor:'private'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   128
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   129
changeDropLineTo:aLineOrNil in:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   130
    |x0 y0 y1 view item bgColor fgColor processEvents|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   131
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   132
    aLineOrNil == dropOverLine ifTrue:[ ^ self ]. "/ nothing changed
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   133
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   134
    view := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   135
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   136
    expandBlock notNil ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   137
        Processor removeTimedBlock:expandBlock.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   138
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   139
    processEvents := (aLineOrNil isNil).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   140
    aDropContext contentsWillChange.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   141
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   142
    (aLineOrNil isNil and:[highlightMode notNil]) ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   143
        "/ resore the selection mode
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   144
        view highlightMode: highlightMode.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   145
        highlightMode := nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   146
        processEvents := true.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   147
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   148
    (dropOverLine notNil and:[dropOverLine ~~ 0]) ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   149
        "/ invalidate old line
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   150
        view invalidateLineAt:dropOverLine.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   151
        processEvents := true.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   152
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   153
    processEvents ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   154
        view windowGroup processExposeEvents.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   155
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   156
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   157
    dropOverLine := aLineOrNil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   158
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   159
    (dropOverLine isNil or:[dropOverLine == 0]) ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   160
        ^ self
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   161
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   162
    item := view at:dropOverLine ifAbsent:nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   163
    item isNil ifTrue:[ ^ self ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   164
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   165
    y0 := view yVisibleOfLine:dropOverLine.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   166
    y1 := view yVisibleOfLine:(dropOverLine + 1).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   167
    x0 := view xVisibleOfTextAtLevel:item level.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   168
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   169
    bgColor := view hilightBackgroundColor.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   170
    fgColor := view hilightForegroundColor.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   171
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   172
    view paint: bgColor.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   173
    view fillRectangle:(Rectangle left:(x0 - 2) top:y0 width:(item widthOn:view) + 4 height:(y1 - y0)).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   174
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   175
    view paint:fgColor on:bgColor.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   176
    item displayOn:view x:x0 y:y0 h:(y1 - y0).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   177
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   178
    (item isExpanded not and:[item canExpand]) ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   179
        Processor 
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   180
            addTimedBlock: [self expandForDrop:aDropContext at:aLineOrNil]
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   181
            afterMilliseconds:(self class delayMilliSecondsBeforeExpand).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   182
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   183
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   184
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   185
expandForDrop:aDropContext at:aLnNr
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   186
    |item view|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   187
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   188
    expandBlock := nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   189
    aLnNr == dropOverLine ifFalse:[ ^ self].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   190
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   191
    view := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   192
    item := view at:aLnNr ifAbsent:nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   193
    item isNil ifTrue:[^ self].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   194
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   195
    aDropContext saveDraw:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   196
        item expand.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   197
        view windowGroup processExposeEvents.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   198
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   199
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   200
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   201
!HierarchicalDropTargetController class methodsFor:'documentation'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   202
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   203
version
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   204
    ^ '$Header: /cvs/stx/stx/libwidg2/HierarchicalDropTargetController.st,v 1.1 2008-03-25 10:11:43 ab Exp $'
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   205
! !