banshee r3297 - in trunk/banshee: . build src/Core/Banshee.Services/Banshee.Base src/Core/Banshee.Services/Banshee.SmartPlaylist src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.ThickClient/Banshee.Query.Gui src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui src/Libraries/Hyena.Gui/Hyena.Query.Gui src/Libraries/Hyena/Hyena.Query



Author: gburt
Date: Thu Feb 21 22:29:54 2008
New Revision: 3297
URL: http://svn.gnome.org/viewvc/banshee?rev=3297&view=rev

Log:
2008-02-21  Gabriel Burt  <gabriel burt gmail com>

	* build/build.environment.mk: Add Mono.Unix dep to Hyena so strings can be
	translated, like they already could be in Hyena.Gui.

	* src/Core/Banshee.Services/Banshee.Base/RateLimiter.cs: Add option to not
	run wrapped method immediately, but to have a delay first.

	* src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:
	Implement DependsOn using depth-first scan of the ConditionTree.

	* src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs: Set a 10ms
	delay before responding to OnTrackUpdated.

	* src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs:
	Check if Editor.CurrentlyEditing is set, and if so, do not put the current
	playlist or ones that depend on it in the dropdown.

	* src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs: Expose
	through a public static property what Smart Playlist is currently being
	edited.

	* src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs: Add and use a
	Gtk.Entry if the query is more complicated than our GUI can handle.

	* src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs: Clean.

	* src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs: Make methods
	protected instead of public, throw exception if unable to handle the
	QueryNode given.

	* src/Libraries/Hyena/Hyena.Query/DateQueryValue.cs: Support parsing and
	generating relative-date user queries.

	* src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs: Put a space
	between the file size and its unit.

	* src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs: Change the default
	alias for the Equal operator to "=" instead of "==".

	* src/Libraries/Hyena/Hyena.Query/QueryListNode.cs: Use ' or ' instead of
	', ' to separate OR'd nodes in generated user queries.

	* src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs: Add a static Parse
	method for convenience.


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/build/build.environment.mk
   trunk/banshee/src/Core/Banshee.Services/Banshee.Base/RateLimiter.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Query/DateQueryValue.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs

Modified: trunk/banshee/build/build.environment.mk
==============================================================================
--- trunk/banshee/build/build.environment.mk	(original)
+++ trunk/banshee/build/build.environment.mk	Thu Feb 21 22:29:54 2008
@@ -52,7 +52,7 @@
 #LINK_GNOME_KEYRING_DEPS = $(REF_GNOME_KEYRING) $(LINK_GNOME_KEYRING)
 
 # Hyena
-REF_HYENA = $(LINK_SYSTEM) $(LINK_SQLITE)
+REF_HYENA = $(LINK_SYSTEM) $(LINK_SQLITE) $(LINK_MONO_POSIX)
 LINK_HYENA = -r:$(DIR_BIN)/Hyena.dll
 LINK_HYENA_DEPS = $(REF_HYENA) $(LINK_HYENA)
 

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Base/RateLimiter.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Base/RateLimiter.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Base/RateLimiter.cs	Thu Feb 21 22:29:54 2008
@@ -36,12 +36,18 @@
         public delegate void RateLimitedMethod ();
 
         private RateLimitedMethod method;
+        private double initial_delay_ms;
         private double min_interval_ms;
         private DateTime last_executed = DateTime.MinValue;
         private uint timeout_id = 0;
 
-        public RateLimiter (double min_interval_ms, RateLimitedMethod method)
+        public RateLimiter (double min_interval_ms, RateLimitedMethod method) : this (0.0, min_interval_ms, method)
         {
+        }
+
+        public RateLimiter (double initial_delay_ms, double min_interval_ms, RateLimitedMethod method)
+        {
+            this.initial_delay_ms = initial_delay_ms;
             this.min_interval_ms = min_interval_ms;
             this.method = method;
         }
@@ -58,8 +64,12 @@
 
             double delta = (DateTime.Now - last_executed).TotalMilliseconds;
             if (delta >= min_interval_ms) {
-                method ();
-                last_executed = DateTime.Now;
+                if (initial_delay_ms == 0.0) {
+                    method ();
+                    last_executed = DateTime.Now;
+                } else {
+                    timeout_id = GLib.Timeout.Add ((uint) initial_delay_ms, OnRateLimitTimer);
+                }
             } else {
                 //Console.WriteLine ("Method rate limited, setting timeout");
                 timeout_id = GLib.Timeout.Add ((uint) min_interval_ms, OnRateLimitTimer);

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	Thu Feb 21 22:29:54 2008
@@ -212,6 +212,29 @@
 
         public bool DependsOn (SmartPlaylistSource source)
         {
+            return DependsOn (source, ConditionTree);
+        }
+
+        private bool DependsOn (SmartPlaylistSource source, QueryNode node)
+        {
+            if (node == null) {
+                return false;
+            }
+
+            if (node is QueryListNode) {
+                foreach (QueryNode child in (node as QueryListNode).Children) {
+                    if (DependsOn (source, child)) {
+                        return true;
+                    }
+                }
+            } else {
+                QueryTermNode term = node as QueryTermNode;
+                if (term.Field == BansheeQuery.SmartPlaylistField) {
+                    if ((term.Value as IntegerQueryValue).IntValue == source.DbId)
+                        return true;
+                }
+            }
+
             return false;
         }
 

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs	Thu Feb 21 22:29:54 2008
@@ -94,7 +94,7 @@
             error_source.Updated += OnErrorSourceUpdated;
             OnErrorSourceUpdated (null, null);
 
-            tracks_updated_limiter = new RateLimiter (50.0, RateLimitedOnTracksUpdated);
+            tracks_updated_limiter = new RateLimiter (10.0, 50.0, RateLimitedOnTracksUpdated);
 
             primary_sources[source_id] = this;
         }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Query.Gui/SmartPlaylistQueryValueEntry.cs	Thu Feb 21 22:29:54 2008
@@ -59,9 +59,11 @@
             foreach (Source child in ServiceManager.SourceManager.DefaultSource.Children) {
                 playlist = child as SmartPlaylistSource;
                 if (playlist != null && playlist.DbId != null) {
-                    combo.AppendText (playlist.Name);
-                    playlist_id_combo_map [(int)playlist.DbId] = count;
-                    combo_playlist_id_map [count++] = (int) playlist.DbId;
+                    if (Editor.CurrentlyEditing == null || (Editor.CurrentlyEditing != playlist && !playlist.DependsOn (Editor.CurrentlyEditing))) {
+                        combo.AppendText (playlist.Name);
+                        playlist_id_combo_map [(int)playlist.DbId] = count;
+                        combo_playlist_id_map [count++] = (int) playlist.DbId;
+                    }
                 }
             }
 

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.SmartPlaylist.Gui/Editor.cs	Thu Feb 21 22:29:54 2008
@@ -22,9 +22,13 @@
     public class Editor : GladeDialog
     {
         private BansheeQueryBox builder;
-
         private SmartPlaylistSource playlist = null;
 
+        private static SmartPlaylistSource currently_editing;
+        public static SmartPlaylistSource CurrentlyEditing {
+            get { return currently_editing; }
+        }
+
         [Widget] private Gtk.Entry name_entry;
         [Widget] private Gtk.VBox builder_box;
         [Widget] private Gtk.Button ok_button;
@@ -34,9 +38,10 @@
 
         public Editor (SmartPlaylistSource playlist) : base ("SmartPlaylistEditorDialog")
         {
+            currently_editing = playlist;
             this.playlist = playlist;
-            Console.WriteLine ("Loading smart playlist into editor: {0}",
-                playlist.ConditionTree == null ? "" : playlist.ConditionTree.ToXml (BansheeQuery.FieldSet, true));
+            /*Console.WriteLine ("Loading smart playlist into editor: {0}",
+                playlist.ConditionTree == null ? "" : playlist.ConditionTree.ToXml (BansheeQuery.FieldSet, true));*/
 
             Initialize ();
 
@@ -205,9 +210,9 @@
 
             QueryNode node = builder.QueryNode;
             if (node == null) {
-                Console.WriteLine ("Editor query is null");
+                //Console.WriteLine ("Editor query is null");
             } else {
-                Console.WriteLine ("Editor query is: {0}", node.ToXml (BansheeQuery.FieldSet, true));
+                //Console.WriteLine ("Editor query is: {0}", node.ToXml (BansheeQuery.FieldSet, true));
             }
 
             if (response == ResponseType.Ok) {
@@ -255,6 +260,7 @@
                 });
             }
 
+            currently_editing = null;
             return response;
         }
 
@@ -293,6 +299,7 @@
                 }
             }
 
+            currently_editing = null;
             Dialog.Destroy ();
         }
 

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryBox.cs	Thu Feb 21 22:29:54 2008
@@ -42,6 +42,10 @@
     public class QueryBox : VBox
     {
         private QueryTermsBox terms_box;
+        private bool complex_query = false;
+
+        private HBox terms_entry_box;
+        private Entry terms_entry;
 
         private QueryLimitBox limit_box;
         public QueryLimitBox LimitBox {
@@ -51,12 +55,14 @@
         private ComboBox terms_logic_combo;
         private CheckButton terms_enabled_checkbox;
         private Label terms_label;
+        private QueryFieldSet field_set;
+        private Frame matchesFrame;
 
         public QueryBox (QueryFieldSet fieldSet, QueryOrder [] orders, QueryLimit [] limits) : base ()
         {
             //this.sorted_fields = fieldSet.Fields;
-            //this.field_set = fieldSet;
-            terms_box = new QueryTermsBox (fieldSet);
+            this.field_set = fieldSet;
+            terms_box = new QueryTermsBox (field_set);
             limit_box = new QueryLimitBox (orders, limits);
 
             BuildInterface ();
@@ -64,17 +70,27 @@
 
         private void BuildInterface ()
         {
+            NoShowAll = true;
+
             Alignment matchesAlignment = new Alignment (0.0f, 0.0f, 1.0f, 1.0f);
-            matchesAlignment.Show ();
             matchesAlignment.SetPadding (5, 5, 5, 5);
             matchesAlignment.Add (terms_box);
         
-            Frame matchesFrame = new Frame (null);
-            matchesFrame.Show ();
+            matchesFrame = new Frame (null);
             matchesFrame.Add (matchesAlignment);
             matchesFrame.LabelWidget = BuildMatchHeader ();
+            matchesFrame.ShowAll ();
+
+            terms_entry_box = new HBox ();
+            terms_entry_box.Spacing = 8;
+            terms_entry_box.PackStart (new Label (Catalog.GetString ("Condition:")), false, false, 0);
+            terms_entry = new Entry ();
+            terms_entry_box.PackStart (terms_entry, true, true, 0);
+
+            limit_box.ShowAll ();
 
             PackStart(matchesFrame, true, true, 0);
+            PackStart(terms_entry_box, false, false, 0);
             PackStart(limit_box, false, false, 0);
 
             //ShowAll ();
@@ -117,26 +133,39 @@
 
         public QueryNode QueryNode {
             get {
-                if (!terms_enabled_checkbox.Active) {
+                if (!complex_query && !terms_enabled_checkbox.Active) {
                     return null;
                 }
 
+                if (complex_query) {
+                    return UserQueryParser.Parse (terms_entry.Text, field_set);
+                }
+
                 QueryListNode node = new QueryListNode (terms_logic_combo.Active == 0 ? Keyword.And : Keyword.Or);
                 foreach (QueryNode child in terms_box.QueryNodes) {
                     node.AddChild (child);
                 }
                 return node.Trim ();
             }
+
             set {
                 if (value != null) {
                     terms_enabled_checkbox.Active = true;
-                    if (value is QueryListNode) {
-                        terms_logic_combo.Active = ((value as QueryListNode).Keyword == Keyword.And) ? 0 : 1;
-                        terms_box.QueryNodes = (value as QueryListNode).Children;
-                    } else {
-                        List<QueryNode> nodes = new List<QueryNode> ();
-                        nodes.Add (value);
-                        terms_box.QueryNodes = nodes;
+
+                    try {
+                        if (value is QueryListNode) {
+                            terms_logic_combo.Active = ((value as QueryListNode).Keyword == Keyword.And) ? 0 : 1;
+                            terms_box.QueryNodes = (value as QueryListNode).Children;
+                        } else {
+                            List<QueryNode> nodes = new List<QueryNode> ();
+                            nodes.Add (value);
+                            terms_box.QueryNodes = nodes;
+                        }
+                    } catch (ArgumentException e) {
+                        complex_query = true;
+                        matchesFrame.HideAll ();
+                        terms_entry.Text = value.ToUserQuery ();
+                        terms_entry_box.ShowAll ();
                     }
                 } else {
                     terms_enabled_checkbox.Active = false;

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermBox.cs	Thu Feb 21 22:29:54 2008
@@ -49,7 +49,6 @@
         private Operator op;
 
         private QueryField [] sorted_fields;
-        //private Operator [] operators; FIXME: not used --Aaron
 
         private ComboBox field_chooser;
         public ComboBox FieldChooser {

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Query.Gui/QueryTermsBox.cs	Thu Feb 21 22:29:54 2008
@@ -90,18 +90,18 @@
         }
 
         private bool first_add_node = true;
-        private void AddNode (QueryNode node)
+        protected void AddNode (QueryNode node)
         {
             if (node is QueryTermNode) {
                 QueryTermBox box = first_add_node ? FirstRow : CreateRow (false);
                 box.QueryNode = node as QueryTermNode;
                 first_add_node = false;
             } else {
-                Console.WriteLine ("Query Gui cannot handle child node: {0}", node.ToString ());
+                throw new ArgumentException ("Query is too complex for GUI query editor", "node");
             }
         }
 
-        public QueryTermBox CreateRow (bool canDelete)
+        protected QueryTermBox CreateRow (bool canDelete)
         {
             QueryTermBox row = new QueryTermBox (sorted_fields);
 
@@ -128,13 +128,13 @@
             return row;
         }
         
-        public void OnRowAddRequest (object o, EventArgs args)
+        protected void OnRowAddRequest (object o, EventArgs args)
         {
             CreateRow (true);
             UpdateCanDelete ();
         }
         
-        public void OnRowRemoveRequest (object o, EventArgs args)
+        protected void OnRowRemoveRequest (object o, EventArgs args)
         {
             QueryTermBox row = o as QueryTermBox;
 
@@ -147,7 +147,7 @@
             UpdateCanDelete ();
         }
         
-        public void UpdateCanDelete ()
+        protected void UpdateCanDelete ()
         {
             FirstRow.CanDelete = terms.Count > 1;
         }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/DateQueryValue.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/DateQueryValue.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/DateQueryValue.cs	Thu Feb 21 22:29:54 2008
@@ -27,8 +27,12 @@
 //
 
 using System;
+using System.Collections.Generic;
 using System.Xml;
 using System.Text;
+using System.Text.RegularExpressions;
+
+using Mono.Unix;
 
 using Hyena;
 
@@ -86,6 +90,7 @@
             //set { offset = value; IsEmpty = false; }
         }
 
+        private Regex number_regex = new Regex ("\\d+");//, RegexOptions.Compiled);
         public override void ParseUserQuery (string input)
         {
             // TODO: Add support for relative strings like "yesterday", "3 weeks ago", "5 days ago"
@@ -93,16 +98,30 @@
                 value = DateTime.Parse (input);
                 IsEmpty = false;
             } catch {
+                Match match = number_regex.Match (input);
+                if (match != Match.Empty && match.Groups.Count > 0) {
+                    int val = Convert.ToInt32 (match.Groups[0].Captures[0].Value);
+                    foreach (RelativeDateFactor factor in Enum.GetValues (typeof(RelativeDateFactor))) {
+                        if (input == FactorString (factor, val)) {
+                            SetRelativeValue ((long) -val, factor);
+                            return;
+                        }
+                    }
+                }
                 IsEmpty = true;
             }
         }
 
         public override string ToUserQuery ()
         {
-            if (value.Hour == 0 && value.Minute == 0 && value.Second == 0) {
-                return value.ToString ("yyyy-MM-dd");
+            if (relative) {
+                return FactorString (factor, (int) (RelativeOffset == 0 ? 0 : (-RelativeOffset / (long) factor)));
             } else {
-                return value.ToString ();
+                if (value.Hour == 0 && value.Minute == 0 && value.Second == 0) {
+                    return value.ToString ("yyyy-MM-dd");
+                } else {
+                    return value.ToString ();
+                }
             }
         }
 
@@ -126,6 +145,7 @@
             try {
                 if (isRelative) {
                     SetRelativeValue (Convert.ToInt64 (val), RelativeDateFactor.Second);
+                    DetermineFactor ();
                 } else {
                     SetValue (DateTime.Parse (val));
                 }
@@ -134,6 +154,18 @@
             }
         }
 
+        protected void DetermineFactor ()
+        {
+            if (relative) {
+                long val = Math.Abs (offset);
+                foreach (RelativeDateFactor factor in Enum.GetValues (typeof(RelativeDateFactor))) {
+                    if (val >= (long) factor) {
+                        this.factor = factor;
+                    }
+                }
+            }
+        }
+
         public override void ParseXml (XmlElement node)
         {
             try {
@@ -163,5 +195,25 @@
         public DateTime DateTime {
             get { return value; }
         }
+
+        protected static string FactorString (RelativeDateFactor factor, int count)
+        {
+            string translated = null;
+            switch (factor) {
+                case RelativeDateFactor.Second: translated = Catalog.GetPluralString ("{0} second", "{0} seconds", count); break;
+                case RelativeDateFactor.Minute: translated = Catalog.GetPluralString ("{0} minute", "{0} minutes", count); break;
+                case RelativeDateFactor.Hour:   translated = Catalog.GetPluralString ("{0} hour",   "{0} hours", count); break;
+                case RelativeDateFactor.Day:    translated = Catalog.GetPluralString ("{0} day",    "{0} days", count); break;
+                case RelativeDateFactor.Week:   translated = Catalog.GetPluralString ("{0} week",   "{0} weeks", count); break;
+                case RelativeDateFactor.Month:  translated = Catalog.GetPluralString ("{0} month",  "{0} months", count); break;
+                case RelativeDateFactor.Year:   translated = Catalog.GetPluralString ("{0} year",   "{0} years", count); break;
+                default: return null;
+            }
+
+            return String.Format (
+                Catalog.GetString ("{0} ago"),
+                String.Format (translated, count)
+            );
+        }
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/FileSizeQueryValue.cs	Thu Feb 21 22:29:54 2008
@@ -110,7 +110,7 @@
         public override string ToUserQuery ()
         {
             if (factor != FileSizeFactor.None) {
-                return String.Format ("{0}{1}",
+                return String.Format ("{0} {1}",
                     IntValue == 0 ? 0 : (IntValue / (long) factor),
                     factor.ToString ()
                 );

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/IntegerQueryValue.cs	Thu Feb 21 22:29:54 2008
@@ -36,7 +36,7 @@
 {
     public class IntegerQueryValue : QueryValue
     {
-        public static readonly Operator Equal              = new Operator ("equals", "= {0}", "==", "=", ":");
+        public static readonly Operator Equal              = new Operator ("equals", "= {0}", "=", "==", ":");
         public static readonly Operator NotEqual           = new Operator ("notEqual", "!= {0}", true, "!=", "!:");
         public static readonly Operator LessThanEqual      = new Operator ("lessThanEquals", "<= {0}", "<=");
         public static readonly Operator GreaterThanEqual   = new Operator ("greaterThanEquals", ">= {0}", ">=");

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryListNode.cs	Thu Feb 21 22:29:54 2008
@@ -182,10 +182,12 @@
                 bool first = true;
                 foreach (QueryNode child in Children) {
                     if (!first) {
-                        if (Keyword == Keyword.Or)
-                            sb.Append (", ");
-                        else
+                        if (Keyword == Keyword.Or) {
+                            // FIXME translate
+                            sb.Append (" or ");
+                        } else {
                             sb.Append (" ");
+                        }
                     } else {
                         first = false;
                     }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/UserQueryParser.cs	Thu Feb 21 22:29:54 2008
@@ -47,6 +47,11 @@
         private QueryListNode root;
         private QueryFieldSet field_set;
 
+        public static QueryNode Parse (string input, QueryFieldSet fieldSet)
+        {
+            return new UserQueryParser (input).BuildTree (fieldSet);
+        }
+
         public UserQueryParser () : base () {}
         public UserQueryParser (string inputQuery) : base (inputQuery) {}
         public UserQueryParser (Stream stream) : base (stream) {}



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