DragAndDropManager.st
changeset 1685 82350f572e2f
parent 1678 9944d3b5d5bf
child 1686 fe4a13681941
--- a/DragAndDropManager.st	Thu Jan 16 11:44:40 2003 +0100
+++ b/DragAndDropManager.st	Sat Jan 18 15:28:36 2003 +0100
@@ -1247,6 +1247,28 @@
     ^false
 !
 
+escapePressed
+    "handle key escape
+    "
+    |dropTarget|
+
+    escapePressed ~~ true ifTrue:[
+        escapePressed := true.
+
+        handler notNil ifTrue:[
+            "/ restore handler
+            dropTarget := dropContext dropTarget.
+            handler postDragging.
+
+            dropTarget notNil ifTrue:[
+                "/ invoke leave operation
+                dropTarget  leave:dropContext.
+                dropContext dropTarget:nil.
+            ].
+        ].
+    ].
+!
+
 handlesButtonMotion:button inView:aView
     "query from event processor: am I interested in button-events ?
      yes I am (to activate the clicked-on field)."
@@ -1286,26 +1308,10 @@
     "any key is pressed:
         #Escape         cancel drag & drop operation
     "
-    |dropTarget|
-
     escapePressed == true ifTrue:[^ self ].     "/ already canceled
 
     aKey == #Escape ifTrue:[
-        "/ cancel drag & drop operation
-        escapePressed := true.
-
-        handler ifNotNil:[
-            "/ restore handler
-            dropTarget := dropContext dropTarget.
-            handler postDragging.
-
-            dropTarget ifNotNil:[
-                "/ invoke leave operation
-                dropTarget leave:dropContext.
-                dropContext dropTarget:nil.
-            ].
-        ].
-        ^ self  
+        self escapePressed.
     ].
 ! !
 
@@ -1393,11 +1399,16 @@
 doStart:aHandler for:aView atEnd:aFourArgEndBlock
     "setup a handler and a restore block
     "
-    |device savedCursor savedDelegate prevGrab prevKeyb sensor p|
+    |device savedCursor savedDelegate prevGrab prevKeyb sensor p lastActive|
 
     device := aView device.
-    (ActiveDragAndDropManagers at:device ifAbsent:nil) notNil ifTrue:[
-        self error:'oops - two dnd managers active' mayProceed:true.
+    lastActive := ActiveDragAndDropManagers at:device ifAbsent:nil.
+
+    lastActive notNil ifTrue:[
+        "/ self error:'oops - two dnd managers active' mayProceed:true.
+
+        lastActive forceGiveUp.
+        'oops - two dnd managers active' printCR.
     ].
     ActiveDragAndDropManagers at:device put:self.
 
@@ -1458,6 +1469,15 @@
     "Modified: / 10.10.2001 / 14:45:22 / cg"
 !
 
+forceGiveUp
+    "called if the DragAndDropManager no longer should be
+     active; a second one is started
+    "
+    self escapePressed.
+    self removePassiveAction.
+    restoreBlock value.
+!
+
 saveDraw:aBlock
     handler postDragging.
     aBlock value.
@@ -1482,7 +1502,7 @@
 !DragAndDropManager class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview2/DragAndDropManager.st,v 1.45 2002-12-10 11:01:29 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview2/DragAndDropManager.st,v 1.46 2003-01-18 14:28:36 ca Exp $'
 ! !
 
 DragAndDropManager initialize!