Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Revision:
0:0a590815d51c
Child:
12:63db16fea709
diff -r 000000000000 -r 0a590815d51c Events/EventDispatcher.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Events/EventDispatcher.cpp	Fri Mar 25 13:47:04 2016 +0000
@@ -0,0 +1,65 @@
+#include "EventDispatcher.h"
+
+EventDispatcher::EventDispatcher() {
+}
+
+
+
+void EventDispatcher::attachListener(EventListener* l) {
+    if(_listeners == NULL) {
+        _listeners = new EventListenerWrapper(l);
+    } else {
+        EventListenerWrapper* w = new EventListenerWrapper(l);
+        EventListenerWrapper* p = _listeners;
+        while(p->next != NULL) {
+            p = p->next;
+        }
+        p->next = w;
+        w->prev = p;
+    }   
+}
+
+void EventDispatcher::detachListener(EventListener* l) {
+    
+    EventListenerWrapper *p = _listeners;
+    
+    if(p == NULL) {
+        return;
+    }
+    
+    while(p->listener != l) {
+        if(p->next == NULL) {
+            return;
+        }
+        p = p->next;
+    }
+    
+    // Found the listener
+    // Is there only one in the list?
+    if(p->prev == NULL && p->next == NULL) {
+        _listeners = NULL;
+    } else if(p->prev == NULL) {
+        // First in the list. Move everything down
+        _listeners = p->next;
+        _listeners->prev = NULL;
+    } else if(p->next == NULL) {
+        p->prev->next = NULL;
+    } else {
+        // Middle of the list
+        p->prev->next = p->next;
+        p->next->prev = p->prev;
+    }
+    
+    delete p;
+}
+
+void EventDispatcher::dispatchEvent(Event e) {
+    EventListenerWrapper* p = _listeners;
+    while(p != NULL) {
+        if(p->listener->isEventTarget(e)) {
+            p->listener->handleEvent(e);
+        }
+        
+        p = p->next;
+    }
+}
\ No newline at end of file