KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > rcp > notification > SelectionManager


1 /*
2  * Created on Apr 19, 2005
3  */

4 package com.nightlabs.rcp.notification;
5
6 import java.util.HashMap JavaDoc;
7 import java.util.Iterator JavaDoc;
8 import java.util.Map JavaDoc;
9
10 import org.eclipse.swt.widgets.Display;
11
12 import com.nightlabs.notification.NotificationEvent;
13 import com.nightlabs.notification.NotificationListener;
14 import com.nightlabs.notification.SubjectCarrier;
15 import com.nightlabs.util.RWLock;
16
17 /**
18  * @author Marco Schulze - marco at nightlabs dot de
19  */

20 public class SelectionManager extends NotificationManager
21 {
22     private static SelectionManager _sharedInstance = null;
23
24     public static SelectionManager sharedInstance()
25     {
26         if (_sharedInstance == null)
27             _sharedInstance = new SelectionManager();
28
29         return _sharedInstance;
30     }
31
32     protected SelectionManager()
33     {
34     }
35
36     /**
37      * key: String zone<br/>
38      * value: Map {<br/>
39      * key: Class searchClass<br/>
40      * value: NotificationEvent event<br/>
41      * }
42      */

43     private Map JavaDoc eventsByZone = new HashMap JavaDoc();
44     private RWLock eventsByZoneMutex = new RWLock("eventsByZoneMutex");
45
46     protected void registerEvent(NotificationEvent event)
47     {
48         eventsByZoneMutex.acquireWriteLock();
49         try {
50
51             Map JavaDoc eventsByClass = (Map JavaDoc) eventsByZone.get(event.getZone());
52             if (eventsByClass == null) {
53                 eventsByClass = new HashMap JavaDoc();
54                 eventsByZone.put(event.getZone(), eventsByClass);
55             }
56     
57             for (Iterator JavaDoc itSubjectCarriers = event.getSubjectCarriers().iterator(); itSubjectCarriers.hasNext(); ) {
58                 SubjectCarrier carrier = (SubjectCarrier) itSubjectCarriers.next();
59                 for (Iterator JavaDoc itClasses = carrier.getSubjectClasses().iterator(); itClasses.hasNext(); ) {
60                     Class JavaDoc clazz = (Class JavaDoc) itClasses.next();
61                     
62                     if (carrier.isInheritanceIgnored())
63                         eventsByClass.put(clazz, event);
64                     else {
65                         do {
66                             eventsByClass.put(clazz, event);
67                             clazz = clazz.getSuperclass();
68                         } while (clazz != null);
69                     }
70                 }
71             } // for (Iterator itSubjectCarriers = event.getSubjectCarriers().iterator(); itSubjectCarriers.hasNext(); ) {
72

73 // for (Iterator it = event.getSubjects().iterator(); it.hasNext(); ) {
74
// Object subject = it.next();
75
// Class clazz = subject.getClass();
76
// do {
77
// eventsByClass.put(clazz, event);
78
// clazz = clazz.getSuperclass();
79
// } while (clazz != null);
80
// }
81
// for (Iterator it = event.getSubjectClassesToClear().iterator(); it.hasNext(); ) {
82
// Class clazz = (Class) it.next();
83
// do {
84
// eventsByClass.put(clazz, event);
85
// clazz = clazz.getSuperclass();
86
// } while (clazz != null);
87
// }
88

89         } finally {
90             eventsByZoneMutex.releaseLock();
91         }
92     }
93
94     /**
95      * @see com.nightlabs.notification.NotificationManager#addNotificationListener(java.lang.String, java.lang.Class, com.nightlabs.notification.NotificationListener)
96      */

97     public void addNotificationListener(
98             String JavaDoc zone, Class JavaDoc subjectClass, final NotificationListener listener)
99     {
100         super.addNotificationListener(zone, subjectClass, listener);
101
102         eventsByZoneMutex.acquireReadLock();
103         try {
104             Map JavaDoc eventsByClass = (Map JavaDoc) eventsByZone.get(zone);
105             if (eventsByClass == null)
106                 return;
107     
108             final NotificationEvent event = (NotificationEvent) eventsByClass.get(subjectClass);
109             if (event == null)
110                 return;
111     
112             Display.getDefault().asyncExec(
113                     new Runnable JavaDoc() {
114                         public void run()
115                         {
116                             SelectionManager.this.notify(event, listener);
117                         }
118                     });
119         } finally {
120             eventsByZoneMutex.releaseLock();
121         }
122     }
123
124     /**
125      * @see com.nightlabs.notification.NotificationManager#intercept(com.nightlabs.notification.NotificationEvent)
126      */

127     protected NotificationEvent intercept(NotificationEvent event)
128     {
129         event = super.intercept(event);
130         registerEvent(event);
131         return event;
132     }
133
134 }
135
Popular Tags