WindowGroup.st
changeset 3511 5c695c10caa1
parent 3486 f93691c57540
child 3538 54c7307306b6
--- a/WindowGroup.st	Wed Sep 19 20:14:30 2001 +0200
+++ b/WindowGroup.st	Mon Sep 24 10:24:13 2001 +0200
@@ -16,7 +16,7 @@
 	instanceVariableNames:'graphicsDevice views topViews myProcess mySensor isModal
 		previousGroup focusView focusSequence preEventHook postEventHook
 		pointerView isForModalSubview focusByTab groupHasFocus busyHook
-		busyHookTimeout inModalLoop'
+		busyHookTimeout inModalLoop preEventHooks postEventHooks'
 	classVariableNames:'LastActiveGroup LastActiveProcess LeaveSignal
 		WindowGroupQuerySignal LastEventQuerySignal BusyHookTime'
 	poolDictionaries:''
@@ -597,6 +597,28 @@
 
 !WindowGroup methodsFor:'accessing-hooks'!
 
+addPostEventHook:anEventProcessor
+    "add another postEventHook"
+
+    postEventHooks isNil ifTrue:[
+        postEventHooks := OrderedCollection new.
+    ].
+    (postEventHooks includesIdentical:anEventProcessor) ifFalse:[
+        postEventHooks add:anEventProcessor
+    ].
+!
+
+addPreEventHook:anEventProcessor
+    "add another preEventHook"
+
+    preEventHooks isNil ifTrue:[
+        preEventHooks := OrderedCollection new.
+    ].
+    (preEventHooks includesIdentical:anEventProcessor) ifFalse:[
+        preEventHooks add:anEventProcessor
+    ].
+!
+
 busyHook 
     "return the busyHook if any"
 
@@ -656,6 +678,32 @@
     preEventHook := anObject
 !
 
+preEventHooks 
+    "return the preEventHooks if any"
+
+    ^ preEventHooks
+
+    "Created: 7.3.1996 / 14:42:42 / cg"
+!
+
+removePostEventHook:anEventProcessor
+    "remove a postEventHook"
+
+    postEventHooks notNil ifTrue:[
+        postEventHooks removeIdentical:anEventProcessor ifAbsent:nil.
+        postEventHooks isEmpty ifTrue:[ postEventHooks := nil ].
+    ].
+!
+
+removePreEventHook:anEventProcessor
+    "remove a preEventHook"
+
+    preEventHooks notNil ifTrue:[
+        preEventHooks removeIdentical:anEventProcessor ifAbsent:nil.
+        preEventHooks isEmpty ifTrue:[ preEventHooks := nil ].
+    ].
+!
+
 showWaitCursorWhenBusyForMillis:millis
     "setup a busyHook, which automatically shows a waitCursor, 
      whenever some action takes longer than millis"
@@ -1343,6 +1391,29 @@
     "Modified: / 5.2.1999 / 22:32:07 / cg"
 !
 
+executePostEventHooksFor:anEvent
+    postEventHook notNil ifTrue:[
+        postEventHook processEvent:anEvent
+    ].
+    postEventHooks notNil ifTrue:[
+        postEventHooks do:[:eachHook |
+            eachHook processEvent:anEvent
+        ]
+    ].
+!
+
+executePreEventHooksFor:anEvent
+    preEventHook notNil ifTrue:[
+        (preEventHook processEvent:anEvent) ifTrue:[ ^ true ].
+    ].
+    preEventHooks notNil ifTrue:[
+        preEventHooks do:[:eachHook |
+            (eachHook processEvent:anEvent) ifTrue:[ ^ true ].
+        ]
+    ].
+    ^ false
+!
+
 leaveEventLoop
     "immediately leave the event loop, returning way back.
      This can be used to leave (and closedown) a modal group.
@@ -1454,11 +1525,7 @@
                         "/ give eventRecorders, catchers etc. 
                         "/ a chance to eat or modify that event
 
-                        (preEventHook  notNil 
-                        and:[preEventHook processEvent:event]) ifTrue:[
-                            ignore := true.
-                        ].
-
+                        ignore := (self executePreEventHooksFor:event).
                         ignore ifFalse:[
                             evView := event view.
 
@@ -1559,10 +1626,7 @@
 
                         "/ give eventRecorders, postProcessors 
                         "/ a chance to see that event
-
-                        postEventHook notNil ifTrue:[
-                            postEventHook processEvent:event
-                        ].
+                        self executePostEventHooksFor:event
                     ]
                 ].
             ].
@@ -1611,8 +1675,7 @@
                     LastEventQuerySignal handle:[:ex |
                         ex proceedWith:event
                     ] do:[
-                        (preEventHook notNil 
-                        and:[preEventHook processEvent:event]) ifFalse:[
+                        (self executePreEventHooksFor:event) ifFalse:[
                             "/
                             "/ if the view is no longer shown (iconified or closed),
                             "/ this is a leftover event and ignored.
@@ -1625,11 +1688,9 @@
 
                                 view dispatchEvent:event withFocusOn:nil delegate:true. 
                             ].
-                        ]
+                        ].
+                        self executePostEventHooksFor:event.
                     ].
-                    postEventHook notNil ifTrue:[
-                        postEventHook processEvent:event
-                    ]
                 ]
             ]
         ]
@@ -1675,8 +1736,7 @@
             LastEventQuerySignal handle:[:ex |
                 ex proceedWith:event
             ] do:[
-                (preEventHook notNil 
-                and:[preEventHook processEvent:event]) ifFalse:[
+                (self executePreEventHooksFor:event) ifFalse:[
                     view := event view.
                     "/
                     "/ if the view is no longer shown (iconified or closed),
@@ -1697,9 +1757,7 @@
                         ]
                     ]
                 ].
-                postEventHook notNil ifTrue:[
-                    postEventHook processEvent:event
-                ]
+                self executePostEventHooksFor:event.
             ]
         ]
     ]
@@ -2598,6 +2656,6 @@
 !WindowGroup class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/WindowGroup.st,v 1.231 2001-09-10 16:08:33 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/WindowGroup.st,v 1.232 2001-09-24 08:24:13 cg Exp $'
 ! !
 WindowGroup initialize!