banshee r3363 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.SmartPlaylist src/Libraries/Hyena/Hyena.Query



Author: scottp
Date: Sat Mar  1 23:49:39 2008
New Revision: 3363
URL: http://svn.gnome.org/viewvc/banshee?rev=3363&view=rev

Log:
* src/Libraries/Hyena/Hyena.Query/QueryNode.cs: Added methods to search
  a QueryNode tree for values of a given type either by depth or
  breadth.

* src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:
  Consume the new QueryNode.SearchForValues method.

Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs	Sat Mar  1 23:49:39 2008
@@ -224,22 +224,6 @@
         
 #region Private Methods
         
-        private void UpdateDependencies (QueryNode node)
-        {
-            if (node is QueryListNode) {
-                foreach (QueryNode child in (node as QueryListNode).Children) {
-                    UpdateDependencies (child);
-                }
-            } else {
-                QueryTermNode term = node as QueryTermNode;
-                if (term != null && term.Field == BansheeQuery.SmartPlaylistField) {
-                    SmartPlaylistSource s = (term.Value as SmartPlaylistQueryValue).ObjectValue;
-                    s.Updated += OnDependencyUpdated;
-                    dependencies.Add (s);
-                }
-            }
-        }
-        
         private void UpdateDependencies ()
         {
             foreach (SmartPlaylistSource s in dependencies) {
@@ -248,7 +232,11 @@
             
             dependencies.Clear ();
             
-            UpdateDependencies (ConditionTree);
+            foreach (SmartPlaylistQueryValue value in ConditionTree.SearchForValues<SmartPlaylistQueryValue> ()) {
+                SmartPlaylistSource playlist = value.ObjectValue;
+                playlist.Updated += OnDependencyUpdated;
+                dependencies.Add (playlist);
+            }
         }
         
         private void OnDependencyUpdated (object sender, EventArgs args)

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs	Sat Mar  1 23:49:39 2008
@@ -28,12 +28,19 @@
 //
 
 using System;
+using System.Collections.Generic;
 using System.Xml;
 using System.IO;
 using System.Text;
 
 namespace Hyena.Query
 {
+    public enum QueryNodeSearchMethod
+    {
+        DepthFirst,
+        BreadthFirst
+    }
+    
     public abstract class QueryNode
     {
         private QueryListNode parent;
@@ -108,6 +115,63 @@
                 }
             }
         }
+        
+        public IEnumerable<T> SearchForValues<T> () where T : QueryValue
+        {
+            return SearchForValues<T> (QueryNodeSearchMethod.DepthFirst);
+        }
+        
+        public IEnumerable<T> SearchForValues<T> (QueryNodeSearchMethod method) where T : QueryValue
+        {
+            if (method == QueryNodeSearchMethod.DepthFirst) {
+                return SearchForValuesByDepth<T> (this);
+            } else {
+                return SearchForValuesByBreadth<T> ();
+            }
+        }
+        
+        private static IEnumerable<T> SearchForValuesByDepth<T> (QueryNode node) where T : QueryValue
+        {
+            QueryListNode list = node as QueryListNode;
+            if (list != null) {
+                foreach (QueryNode child in list.Children) {
+                    foreach (T item in SearchForValuesByDepth<T> (child)) {
+                        yield return item;
+                    }
+                }
+            } else {
+                QueryTermNode term = node as QueryTermNode;
+                if (term != null) {
+                    T value = term.Value as T;
+                    if (value != null) {
+                        yield return value;
+                    }
+                }
+            }
+        }
+        
+        private IEnumerable<T> SearchForValuesByBreadth<T> () where T : QueryValue
+        {
+            Queue<QueryNode> queue = new Queue<QueryNode> ();
+            queue.Enqueue (this);
+            do {
+                QueryNode node = queue.Dequeue ();
+                QueryListNode list = node as QueryListNode;
+                if (list != null) {
+                    foreach (QueryNode child in list.Children) {
+                        queue.Enqueue (child);
+                    }
+                } else {
+                    QueryTermNode term = node as QueryTermNode;
+                    if (term != null && term.Value is T) {
+                        T value = term.Value as T;
+                        if (value != null) {
+                            yield return value;
+                        }
+                    }
+                }
+            } while (queue.Count > 0);
+        }
 
         public override string ToString ()
         {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]