HierarchicalDropTargetController.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Jun 2019 11:25:19 +0100
branchjv
changeset 6070 a0e88386e17c
parent 5142 aff1f7d34b8a
child 5813 bbfae6ced887
permissions -rw-r--r--
UI: move all items in menu to the right as if there was an icon If there's no icon, just fraw empty space. This makes popup menus with no icons at all looks similar to popup menus with icons and also makes item labels more readable. In general, looks much better and fits better into modern desktops (GNOME & Windows behave the same).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3756
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     1
"
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     2
 COPYRIGHT (c) 2008 by eXept Software AG
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     3
              All Rights Reserved
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     4
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     5
 This software is furnished under a license and may be used
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     6
 only in accordance with the terms of that license and with the
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     8
 be provided or otherwise made available to, or used by, any
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
     9
 other person.  No title to or ownership of the software is
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    10
 hereby transferred.
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    11
"
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    12
"{ Package: 'stx:libwidg2' }"
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    13
4835
10986fc8bd78 class: HierarchicalDropTargetController
Stefan Vogel <sv@exept.de>
parents: 3868
diff changeset
    14
"{ NameSpace: Smalltalk }"
10986fc8bd78 class: HierarchicalDropTargetController
Stefan Vogel <sv@exept.de>
parents: 3868
diff changeset
    15
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    16
Object subclass:#HierarchicalDropTargetController
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    17
	instanceVariableNames:'expandBlock highlightMode receiver dropOverLine dropSelector
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    18
		canDropSelector canExpandSelector'
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    19
	classVariableNames:''
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    20
	poolDictionaries:''
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    21
	category:'Interface-DragAndDrop'
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    22
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    23
3756
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    24
!HierarchicalDropTargetController class methodsFor:'documentation'!
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    25
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    26
copyright
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    27
"
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    28
 COPYRIGHT (c) 2008 by eXept Software AG
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    29
              All Rights Reserved
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    30
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    31
 This software is furnished under a license and may be used
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    32
 only in accordance with the terms of that license and with the
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    33
 inclusion of the above copyright notice.   This software may not
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    34
 be provided or otherwise made available to, or used by, any
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    35
 other person.  No title to or ownership of the software is
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    36
 hereby transferred.
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    37
"
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
    38
! !
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    39
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    40
!HierarchicalDropTargetController class methodsFor:'instance creation'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    41
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    42
receiver:aReceiver argument:anArgument dropSelector:aDropSelector canDropSelector:aCanDropSelector
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    43
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    44
    ^ self 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    45
        receiver:aReceiver 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    46
        argument:anArgument 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    47
        dropSelector:aDropSelector
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    48
        canDropSelector:aCanDropSelector 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    49
        canExpandSelector:nil
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    50
!
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    51
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    52
receiver:aReceiver argument:anArgument dropSelector:aDropSelector canDropSelector:aCanDropSelector canExpandSelector: aCanExpandSelector
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    53
    |target|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    54
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    55
    target := self new.
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    56
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    57
    ^ target
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    58
        receiver:aReceiver 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    59
        argument:anArgument 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    60
        dropSelector:aDropSelector 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    61
        canDropSelector:aCanDropSelector 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    62
        canExpandSelector:aCanExpandSelector
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    63
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    64
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    65
receiver:aReceiver dropSelector:aDropSelector canDropSelector:aCanDropSelector
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    66
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    67
    ^ self
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    68
        receiver:aReceiver 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    69
        argument:nil 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    70
        dropSelector:aDropSelector
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    71
        canDropSelector:aCanDropSelector
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    72
        canExpandSelector:nil
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    73
!
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    74
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    75
receiver:aReceiver dropSelector:aDropSelector canDropSelector:aCanDropSelector canExpandSelector:aCanExpandSelector
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    76
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    77
    ^ self
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    78
        receiver:aReceiver 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    79
        argument:nil 
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    80
        dropSelector:aDropSelector
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    81
        canDropSelector:aCanDropSelector
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
    82
        canExpandSelector:aCanExpandSelector
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    83
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    84
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    85
!HierarchicalDropTargetController class methodsFor:'constants'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    86
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    87
delayMilliSecondsBeforeExpand
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    88
    ^ 1000
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    89
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    90
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    91
!HierarchicalDropTargetController methodsFor:'drop actions'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    92
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    93
canDrop:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    94
    "return true, if the DropContext can be dropped into the list of items"
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    95
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    96
    dropOverLine isNil ifTrue:[ ^ false ].      "/ never setup by dropEnter:
3434
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
    97
    canDropSelector isNil ifTrue:[ ^ false ].
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
    98
3434
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
    99
    ^ receiver 
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   100
        perform:canDropSelector 
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   101
        withOptionalArgument:aDropContext and:dropOverLine
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   102
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   103
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   104
drop:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   105
    "drop the dropContext into the hierachical list of items
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   106
    "
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   107
    |lnNr|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   108
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   109
    (self canDrop:aDropContext) ifFalse:[
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   110
        self dropLeave:aDropContext.
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   111
        ^ false.
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   112
    ].
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   113
    lnNr := dropOverLine.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   114
    lnNr isNil ifTrue:[^ false ].      "/ never setup by dropEnter:
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   115
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   116
    self dropLeave:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   117
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   118
    dropSelector isNil ifTrue:[ ^ false ].
3434
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   119
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   120
    ^ receiver 
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   121
        perform:dropSelector 
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   122
        withOptionalArgument:aDropContext and:lnNr
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   123
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   124
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   125
dropEnter:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   126
    "a drop operation enters my widget; set the highlightMode in the target widget"
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   127
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   128
    |widget|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   129
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   130
    dropOverLine := 0.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   131
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   132
    widget := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   133
    highlightMode := widget highlightMode.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   134
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   135
    highlightMode notNil ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   136
        aDropContext saveDraw:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   137
            widget highlightMode: #dropMode.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   138
            widget windowGroup processExposeEvents.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   139
        ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   140
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   141
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   142
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   143
dropLeave:aDropContext
3868
8e73b46c547c comment/format in: #dropLeave:
Claus Gittinger <cg@exept.de>
parents: 3756
diff changeset
   144
    "restore drop indications drawn..."
8e73b46c547c comment/format in: #dropLeave:
Claus Gittinger <cg@exept.de>
parents: 3756
diff changeset
   145
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   146
    self changeDropLineTo:nil in:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   147
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   148
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   149
dropOver:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   150
    |target lineNr|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   151
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   152
    dropOverLine isNil ifTrue:[^ self ].       "/ never setup by dropEnter:
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   153
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   154
    target := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   155
    lineNr := target yVisibleToLineNr:(aDropContext targetPoint y).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   156
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   157
    lineNr isNil ifTrue:[ lineNr := 0. ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   158
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   159
    lineNr > target size ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   160
        lineNr := 0.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   161
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   162
    self changeDropLineTo:lineNr in:aDropContext.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   163
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   164
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   165
!HierarchicalDropTargetController methodsFor:'instance creation'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   166
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   167
receiver:aReceiver argument:anArgument dropSelector:aDropSelector canDropSelector:aCanDropSelector canExpandSelector:aCanExpandSelector
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   168
    |target|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   169
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   170
    receiver        := aReceiver.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   171
    dropSelector    := aDropSelector.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   172
    canDropSelector := aCanDropSelector.
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   173
    canExpandSelector := aCanExpandSelector.
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   174
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   175
    target := DropTarget
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   176
        receiver:self
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   177
        argument:anArgument
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   178
        dropSelector:#drop:
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   179
        canDropSelector:#canDrop:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   180
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   181
    target enterSelector:#dropEnter:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   182
    target leaveSelector:#dropLeave:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   183
    target overSelector:#dropOver:.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   184
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   185
    ^ target
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   186
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   187
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   188
!HierarchicalDropTargetController methodsFor:'private'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   189
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   190
changeDropLineTo:aLineOrNil in:aDropContext
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   191
    |x0 y0 y1 view item bgColor fgColor processEvents|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   192
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   193
    aLineOrNil == dropOverLine ifTrue:[ ^ self ]. "/ nothing changed
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   194
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   195
    view := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   196
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   197
    expandBlock notNil ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   198
        Processor removeTimedBlock:expandBlock.
5142
aff1f7d34b8a #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 4879
diff changeset
   199
        expandBlock := nil.
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   200
    ].
4879
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   201
    processEvents := aLineOrNil isNil.
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   202
    aDropContext contentsWillChange.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   203
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   204
    (aLineOrNil isNil and:[highlightMode notNil]) ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   205
        "/ resore the selection mode
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   206
        view highlightMode: highlightMode.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   207
        highlightMode := nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   208
        processEvents := true.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   209
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   210
    (dropOverLine notNil and:[dropOverLine ~~ 0]) ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   211
        "/ invalidate old line
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   212
        view invalidateLineAt:dropOverLine.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   213
        processEvents := true.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   214
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   215
    processEvents ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   216
        view windowGroup processExposeEvents.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   217
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   218
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   219
    dropOverLine := aLineOrNil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   220
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   221
    (dropOverLine isNil or:[dropOverLine == 0]) ifTrue:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   222
        ^ self
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   223
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   224
    item := view at:dropOverLine ifAbsent:nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   225
    item isNil ifTrue:[ ^ self ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   226
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   227
    y0 := view yVisibleOfLine:dropOverLine.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   228
    y1 := view yVisibleOfLine:(dropOverLine + 1).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   229
    x0 := view xVisibleOfTextAtLevel:item level.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   230
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   231
    bgColor := view hilightBackgroundColor.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   232
    fgColor := view hilightForegroundColor.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   233
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   234
    view paint: bgColor.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   235
    view fillRectangle:(Rectangle left:(x0 - 2) top:y0 width:(item widthOn:view) + 4 height:(y1 - y0)).
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   236
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   237
    view paint:fgColor on:bgColor.
4835
10986fc8bd78 class: HierarchicalDropTargetController
Stefan Vogel <sv@exept.de>
parents: 3868
diff changeset
   238
    item displayOn:view x:x0 y:y0 h:(y1 - y0) isHighlightedAsSelected:false.
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   239
4879
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   240
    view device isX11Platform ifTrue:[
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   241
        "work around X11 draw problems"
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   242
        Delay waitForMilliseconds:20.
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   243
    ].
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   244
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   245
    item isExpanded ifTrue:[ ^ self ].
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   246
    item canExpand ifFalse:[ ^ self ].
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   247
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   248
    canExpandSelector notNil ifTrue:[
3434
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   249
        (receiver 
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   250
            perform:canExpandSelector 
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   251
            withOptionalArgument:aDropContext and:dropOverLine) 
c5cb440dc848 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3379
diff changeset
   252
        ifFalse:[
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   253
            ^ self
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   254
        ].
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   255
    ].
5142
aff1f7d34b8a #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 4879
diff changeset
   256
    expandBlock := [self expandForDrop:aDropContext at:aLineOrNil].
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   257
    Processor 
5142
aff1f7d34b8a #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 4879
diff changeset
   258
        addTimedBlock:expandBlock
3379
060bb2feff4b Support new drag and drop behaviour
ab
parents: 3371
diff changeset
   259
        afterMilliseconds:(self class delayMilliSecondsBeforeExpand).
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   260
!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   261
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   262
expandForDrop:aDropContext at:aLnNr
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   263
    |item view|
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   264
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   265
    expandBlock := nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   266
    aLnNr == dropOverLine ifFalse:[ ^ self].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   267
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   268
    view := aDropContext targetWidget.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   269
    item := view at:aLnNr ifAbsent:nil.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   270
    item isNil ifTrue:[^ self].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   271
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   272
    aDropContext saveDraw:[
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   273
        item expand.
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   274
        view windowGroup processExposeEvents.
4879
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   275
        view device isX11Platform ifTrue:[
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   276
            "work around X11 draw problems"
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   277
            Delay waitForMilliseconds:20.
Stefan Vogel <sv@exept.de>
parents: 4835
diff changeset
   278
        ].
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   279
    ].
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   280
! !
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   281
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   282
!HierarchicalDropTargetController class methodsFor:'documentation'!
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   283
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   284
version
4835
10986fc8bd78 class: HierarchicalDropTargetController
Stefan Vogel <sv@exept.de>
parents: 3868
diff changeset
   285
    ^ '$Header$'
3756
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
   286
!
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
   287
c0660afa7da3 added: #copyright
Claus Gittinger <cg@exept.de>
parents: 3434
diff changeset
   288
version_CVS
4835
10986fc8bd78 class: HierarchicalDropTargetController
Stefan Vogel <sv@exept.de>
parents: 3868
diff changeset
   289
    ^ '$Header$'
3371
c80f59a3a422 initial checkin
ab
parents:
diff changeset
   290
! !
4835
10986fc8bd78 class: HierarchicalDropTargetController
Stefan Vogel <sv@exept.de>
parents: 3868
diff changeset
   291