]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/UpdateMessageBroker.java
Version 18.1, September 2015
[GpsPrune.git] / tim / prune / UpdateMessageBroker.java
index cac2a79dddc08e5a5d68ccc6f3dcca934c73a930..16599735a80fc831ede28f72241f1310f42a3bb7 100644 (file)
@@ -4,39 +4,66 @@ package tim.prune;
  * Class responsible for distributing update information
  * to all registered listeners
  */
-public class UpdateMessageBroker
+public abstract class UpdateMessageBroker
 {
-       private DataSubscriber[] _subscribers;
-       private int _subscriberNum = 0;
-       private static final int MAXIMUM_NUMBER_SUBSCRIBERS = 5;
+       private static final int MAXIMUM_NUMBER_SUBSCRIBERS = 8;
+       /** Array of all subscribers */
+       private static DataSubscriber[] _subscribers = new DataSubscriber[MAXIMUM_NUMBER_SUBSCRIBERS];
+       /** Index from which to start looking for an empty slot*/
+       private static int _searchStartIndex = 0;
+       /** Enable/disabled flag */
+       private static boolean _enabled = true;
 
 
        /**
-        * Constructor
-        * @param inTrack Track object
+        * Add a data subscriber to the list
+        * @param inSub DataSubscriber to add
         */
-       public UpdateMessageBroker()
+       public static void addSubscriber(DataSubscriber inSub)
        {
-               _subscribers = new DataSubscriber[MAXIMUM_NUMBER_SUBSCRIBERS];
+               // Loop looking for first null entry
+               for (int i=_searchStartIndex; i<MAXIMUM_NUMBER_SUBSCRIBERS; i++)
+               {
+                       if (_subscribers[i] == null)
+                       {
+                               _subscribers[i] = inSub;
+                               _searchStartIndex = i+1;
+                               break;
+                       }
+               }
        }
 
-
        /**
-        * Add a data subscriber to the list
-        * @param inSub DataSubscriber to add
+        * Remove the given subscriber from the list
+        * @param inSub subscriber to remove
         */
-       public void addSubscriber(DataSubscriber inSub)
+       public static void removeSubscriber(DataSubscriber inSub)
        {
-               _subscribers[_subscriberNum] = inSub;
-               _subscriberNum++;
+               for (int i=0; i<MAXIMUM_NUMBER_SUBSCRIBERS; i++)
+               {
+                       if (_subscribers[i] == inSub)
+                       {
+                               _subscribers[i] = null;
+                               // Could break out of the loop here but we want to make sure we remove all of them
+                       }
+               }
+               _searchStartIndex = 0; // for the next add, start from beginning to ensure all gaps are filled
        }
 
+       /**
+        * Enable or disable the messaging (to allow temporary disabling for multiple operations)
+        * @param inEnabled false to disable, true to enable again
+        */
+       public static void enableMessaging(boolean inEnabled)
+       {
+               _enabled = inEnabled;
+       }
 
        /**
         * Send a message to all subscribers that
         * the data has been updated
         */
-       public void informSubscribers()
+       public static void informSubscribers()
        {
                informSubscribers(DataSubscriber.ALL);
        }
@@ -46,8 +73,10 @@ public class UpdateMessageBroker
         * Send message to all subscribers
         * @param inChange Change that occurred
         */
-       public void informSubscribers(byte inChange)
+       public static void informSubscribers(byte inChange)
        {
+               // TODO: Launch separate thread so that whatever caused the inform can finish
+               if (!_enabled) return;
                for (int i=0; i<_subscribers.length; i++)
                {
                        if (_subscribers[i] != null)
@@ -56,4 +85,20 @@ public class UpdateMessageBroker
                        }
                }
        }
+
+       /**
+        * Send message to all subscribers
+        * @param inMessage message to display informing of action completed
+        */
+       public static void informSubscribers(String inMessage)
+       {
+               if (!_enabled) return;
+               for (int i=0; i<_subscribers.length; i++)
+               {
+                       if (_subscribers[i] != null)
+                       {
+                               _subscribers[i].actionCompleted(inMessage);
+                       }
+               }
+       }
 }