Exemplo n.º 1
0
        internal virtual void PumpOneEventForFilters(int id)
        {
            AWTEvent @event  = null;
            bool     eventOK = false;

            try
            {
                EventQueue eq = null;
                EventQueueDelegate.Delegate @delegate = null;
                do
                {
                    // EventQueue may change during the dispatching
                    eq        = EventQueue;
                    @delegate = EventQueueDelegate.Delegate;

                    if (@delegate != null && id == ANY_EVENT)
                    {
                        @event = @delegate.getNextEvent(eq);
                    }
                    else
                    {
                        @event = (id == ANY_EVENT) ? eq.NextEvent : eq.GetNextEvent(id);
                    }

                    eventOK = true;
                    lock (EventFilters)
                    {
                        for (int i = EventFilters.Count - 1; i >= 0; i--)
                        {
                            EventFilter f = EventFilters[i];
                            EventFilter_FilterAction accept = f.AcceptEvent(@event);
                            if (accept == EventFilter_FilterAction.REJECT)
                            {
                                eventOK = false;
                                break;
                            }
                            else if (accept == EventFilter_FilterAction.ACCEPT_IMMEDIATELY)
                            {
                                break;
                            }
                        }
                    }
                    eventOK = eventOK && SunDragSourceContextPeer.checkEvent(@event);
                    if (!eventOK)
                    {
                        @event.Consume();
                    }
                } while (eventOK == false);

                if (EventLog.isLoggable(PlatformLogger.Level.FINEST))
                {
                    EventLog.finest("Dispatching: " + @event);
                }

                Object handle = null;
                if (@delegate != null)
                {
                    handle = @delegate.beforeDispatch(@event);
                }
                eq.DispatchEvent(@event);
                if (@delegate != null)
                {
                    @delegate.afterDispatch(@event, handle);
                }
            }
            catch (ThreadDeath death)
            {
                DoDispatch = false;
                throw death;
            }
            catch (InterruptedException)
            {
                DoDispatch = false;                 // AppContext.dispose() interrupts all
                // Threads in the AppContext
            }
            catch (Throwable e)
            {
                ProcessException(e);
            }
        }