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
- From: gburt svn gnome org
- To: svn-commits-list gnome org
- Subject: 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
- Date: Thu, 21 Feb 2008 22:29:54 +0000 (GMT)
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]