banshee r4569 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.Query src/Core/Banshee.ThickClient/Banshee.Collection.Gui src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui src/Libraries/Hyena.Gui/Hyena.Data.Gui src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView src/Libraries/Hyena/Hyena.Query



Author: gburt
Date: Thu Sep 18 23:55:33 2008
New Revision: 4569
URL: http://svn.gnome.org/viewvc/banshee?rev=4569&view=rev

Log:
2008-09-18  Gabriel Burt  <gabriel burt gmail com>

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPublished.cs:
	Use the new SetMinMaxStrings method in ColumnCellText to define the
	min/max widths for these columns.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs:
	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs:
	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs:
	Update to new ColumnCellText API, replacing the Text property with a
	GetText method so we can get the text for any arbitrary object (the
	min/max strings, for example) instead of just the bound object.

	* src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs: Add ShortLabels
	for a few fields, and make sorting by Grouping the same as sorting by
	track.

	* src/Libraries/Hyena/Hyena.Query/QueryField.cs: Add a ShortLabel property
	that default to the value of Label.

	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs:
	Only set the min/max widths if they were actually specified in the XML.

	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs:
	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs:
	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs:
	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs:
	Use the new SetMinMaxStrings method and change to the new GetText method.

	* src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs:
	Set the Uri column to ellipsize in the middle of the string, and change
	the ColumnCellPositiveInt columns to use its new ctor to specify the
	min/max number of digits (eg always 4 for Year).  Use the QueryFields'
	ShortLabel property for the column Title.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs: Add
	static GetArrowWidth method and get rid of MinWidth property.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs: Replace
	GetSize method with GetWidthRange.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs: Add CalculateWidths
	method that is passed a Pango.Layout so we can calculate an accurate
	Min/Max width for a column

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/IHeaderCell.cs: Get rid of
	MinWidth property.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs: Call
	column.CalculateWidths before accessing the Min/MaxWidth properties.  When
	resizing a column, don't let it be resized bigger than the MaxWidth.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs:
	Handle escape key to stop column moving/DnD.  Reorder conditional to avoid
	iterating over all columns to see if there is a resizable column at the x
	position every time MotionEvent is fired - no need to do that unless the
	motion was inside the header. 

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs: Replace Text
	property that returned the BoundObject with a GetText method that takes
	any object.  Add protected SetMinMaxStrings method that subclasses can
	use to specify objects, which are converted to strings using GetText and
	then their width retrieved using the Pango.Layout passed to GetWidthRange.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs: Set the Xpad
	to 0 - there previously was too much padding on the left/right.  And
	replace GetSize and GetWidthRange.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs: Replace
	GetSize with GetWidthRange.



Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPublished.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IHeaderCell.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryField.cs

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs	Thu Sep 18 23:55:33 2008
@@ -151,8 +151,7 @@
 
         public static QueryField BpmField = new QueryField (
             "bpm", "Bpm",
-            // Translators: noun
-            Catalog.GetString ("BPM"), "CoreTracks.BPM", typeof(NaturalIntegerQueryValue),
+            Catalog.GetString ("Beats per Minute"), "CoreTracks.BPM", typeof(NaturalIntegerQueryValue),
             // Translators: These are unique search fields.  Please, no spaces. Blank ok.
             Catalog.GetString ("bpm"),
             "bpm"
@@ -320,6 +319,15 @@
             BpmField, BitRateField, DateAddedField, PlaylistField, SmartPlaylistField
         );
 
+        // Type Initializer
+        static BansheeQuery ()
+        {
+            // Translators: noun
+            BpmField.ShortLabel         = Catalog.GetString ("BPM");
+            SkipCountField.ShortLabel   = Catalog.GetString ("Skips");
+            PlayCountField.ShortLabel   = Catalog.GetString ("Plays");
+        }
+
         private const string default_sort = @"CoreAlbums.ArtistNameLowered ASC, CoreAlbums.TitleLowered ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC";
         public static string GetSort (string key)
         {
@@ -334,6 +342,7 @@
             string column = null;
             switch (key.ToLower ()) {
                 case "track":
+                case "grouping":
                     sort_query = String.Format (@"
                         CoreAlbums.ArtistNameLowered ASC, 
                         CoreAlbums.TitleLowered ASC, 
@@ -389,7 +398,6 @@
                 case "bitrate":
                 case "bpm":
                 case "conductor":
-                case "grouping":
                 case "trackcount":
                 case "disc":
                 case "disccount":

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDateTime.cs	Thu Sep 18 23:55:33 2008
@@ -53,27 +53,27 @@
             set { format = value; }
         }
         
-        protected override string Text {
-            get {
-                if (BoundObject == null)
-                    return String.Empty;
-
-                DateTime dt = (DateTime) BoundObject;
-                
-                if (dt == DateTime.MinValue)
-                    return String.Empty;
+        protected override string GetText (object obj)
+        {
+            if (obj == null) {
+                return String.Empty;
+            }
 
-                switch (Format)
-                {
-                case DateTimeFormat.Long:         return dt.ToString ();
-                case DateTimeFormat.ShortDate:    return dt.ToShortDateString ();
-                case DateTimeFormat.LongDate:     return dt.ToLongDateString ();
-                case DateTimeFormat.ShortTime:    return dt.ToShortTimeString ();
-                case DateTimeFormat.LongTime:     return dt.ToLongTimeString ();
-                }
-                
+            DateTime dt = (DateTime) obj;
+            
+            if (dt == DateTime.MinValue) {
                 return String.Empty;
             }
+
+            switch (Format) {
+            case DateTimeFormat.Long:         return dt.ToString ();
+            case DateTimeFormat.ShortDate:    return dt.ToShortDateString ();
+            case DateTimeFormat.LongDate:     return dt.ToLongDateString ();
+            case DateTimeFormat.ShortTime:    return dt.ToShortTimeString ();
+            case DateTimeFormat.LongTime:     return dt.ToLongTimeString ();
+            }
+            
+            return String.Empty;
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellDuration.cs	Thu Sep 18 23:55:33 2008
@@ -37,25 +37,25 @@
         public ColumnCellDuration (string property, bool expand) : base (property, expand)
         {
             Alignment = Pango.Alignment.Right;
+            SetMinMaxStrings (TimeSpan.FromHours (5.73), TimeSpan.FromDays (7.34));
         }
         
-        protected override string Text {
-            get {
-                if (!(BoundObject is TimeSpan)) {
-                    return base.Text;
-                }
-                
-                // Fancy rounding commented out since it's not consistent with what is
-                // done in libbanshee.  See http://bugzilla.gnome.org/show_bug.cgi?id=520648
-                //int seconds = (int)Math.Round(((TimeSpan)BoundObject).TotalSeconds);
-                int seconds = (int) ((TimeSpan)BoundObject).TotalSeconds;
-                
-                if (seconds == 0) {
-                    return String.Empty;
-                }
-                
-                return Banshee.Sources.DurationStatusFormatters.ConfusingPreciseFormatter (TimeSpan.FromSeconds (seconds));
+        protected override string GetText (object obj)
+        {
+            if (!(obj is TimeSpan)) {
+                return base.GetText (obj);
+            }
+            
+            // Fancy rounding commented out since it's not consistent with what is
+            // done in libbanshee.  See http://bugzilla.gnome.org/show_bug.cgi?id=520648
+            //int seconds = (int)Math.Round(((TimeSpan)obj).TotalSeconds);
+            int seconds = (int) ((TimeSpan)obj).TotalSeconds;
+            
+            if (seconds == 0) {
+                return String.Empty;
             }
+                
+            return Banshee.Sources.DurationStatusFormatters.ConfusingPreciseFormatter (TimeSpan.FromSeconds (seconds));
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellFileSize.cs	Thu Sep 18 23:55:33 2008
@@ -38,18 +38,19 @@
         public ColumnCellFileSize (string property, bool expand) : base (property, expand)
         {
             Alignment = Pango.Alignment.Right;
+            SetMinMaxStrings ((long)1023, (long)(1024 * 1024 * 575.5));
         }
         
-        protected override string Text {
-            get {
-                if (BoundObject == null)
-                    return String.Empty;
-
-                long bytes = (long) BoundObject;
-                return bytes <= 0
-                    ? String.Empty
-                    : new FileSizeQueryValue (bytes).ToUserQuery (true);
+        protected override string GetText (object obj)
+        {
+            if (obj == null) {
+                return String.Empty;
             }
+
+            long bytes = (long) obj;
+            return bytes <= 0
+                ? String.Empty
+                : new FileSizeQueryValue (bytes).ToUserQuery (true);
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellPositiveInt.cs	Thu Sep 18 23:55:33 2008
@@ -34,18 +34,19 @@
 {
     public class ColumnCellPositiveInt : ColumnCellText
     {
-        public ColumnCellPositiveInt (string property, bool expand) : base (property, expand)
+        public ColumnCellPositiveInt (string property, bool expand, int min_digits, int max_digits) : base (property, expand)
         {
+            SetMinMaxStrings ((int)Math.Pow (10, min_digits) - 1, (int)Math.Pow (10, max_digits) - 1);
         }
         
-        protected override string Text {
-            get {
-                if (BoundObject == null)
-                    return String.Empty;
-
-                int val = (int) BoundObject;
-                return val > 0 ? val.ToString () : String.Empty;
+        protected override string GetText (object obj)
+        {
+            if (obj == null) {
+                return String.Empty;
             }
+
+            int val = (int) obj;
+            return val > 0 ? val.ToString () : String.Empty;
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellQueryText.cs	Thu Sep 18 23:55:33 2008
@@ -40,11 +40,10 @@
             this.blank = blank;
         }
         
-        protected override string Text {
-            get { 
-                string text = base.Text;
-                return String.IsNullOrEmpty (text) ? blank : text;
-            }
+        protected override string GetText (object obj)
+        {
+            string text = base.GetText (obj);
+            return String.IsNullOrEmpty (text) ? blank : text;
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrackNumber.cs	Thu Sep 18 23:55:33 2008
@@ -36,16 +36,16 @@
     {
         public ColumnCellTrackNumber (string property, bool expand) : base (property, expand)
         {
+            SetMinMaxStrings (99, 999);
         }
         
-        protected override string Text {
-            get {
-                if (BoundObject == null || (int) BoundObject == 0) {
-                    return String.Empty;
-                }
-
-                return BoundObject.ToString ();
+        protected override string GetText (object obj)
+        {
+            if (obj == null || (int) obj == 0) {
+                return String.Empty;
             }
+
+            return obj.ToString ();
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	Thu Sep 18 23:55:33 2008
@@ -109,22 +109,31 @@
             genre_column        = CreateText (BansheeQuery.GenreField, 0.25);
 
             duration_column     = Create (BansheeQuery.DurationField, 0.10, true, new ColumnCellDuration (null, true));
-            year_column         = Create (BansheeQuery.YearField, 0.15, false, new ColumnCellPositiveInt (null, true));
+            year_column         = Create (BansheeQuery.YearField, 0.15, false, new ColumnCellPositiveInt (null, true, 4, 4));
             file_size_column    = Create (BansheeQuery.FileSizeField, 0.15, false, new ColumnCellFileSize (null, true));
             track_count_column  = Create (BansheeQuery.TrackCountField, 0.10, false, new ColumnCellTrackNumber (null, true));
-            disc_column         = Create (BansheeQuery.DiscField, 0.10, false, new ColumnCellPositiveInt (null, true));
-            disc_count_column   = Create (BansheeQuery.DiscCountField, 0.10, false, new ColumnCellPositiveInt (null, true));
-            bpm_column          = Create (BansheeQuery.BpmField, 0.10, false, new ColumnCellPositiveInt (null, true));
-            bitrate_column      = Create (BansheeQuery.BitRateField, 0.10, false, new ColumnCellPositiveInt (null, true));
+            disc_column         = Create (BansheeQuery.DiscField, 0.10, false, new ColumnCellPositiveInt (null, true, 1, 2));
+            disc_count_column   = Create (BansheeQuery.DiscCountField, 0.10, false, new ColumnCellPositiveInt (null, true, 1, 2));
+            bpm_column          = Create (BansheeQuery.BpmField, 0.10, false, new ColumnCellPositiveInt (null, true, 3, 3));
+
+            ColumnCellPositiveInt br_cell = new ColumnCellPositiveInt (null, true, 3, 3);
+            br_cell.TextFormat = Catalog.GetString ("{0} kbps");
+            bitrate_column      = Create (BansheeQuery.BitRateField, 0.10, false, br_cell);
+            
             rating_column       = Create (BansheeQuery.RatingField, 0.15, false, new ColumnCellRating (null, true));
 
             composer_column     = CreateText (BansheeQuery.ComposerField, 0.25);
             conductor_column    = CreateText (BansheeQuery.ConductorField, 0.25);
             grouping_column     = CreateText (BansheeQuery.GroupingField, 0.25);
             comment_column      = CreateText (BansheeQuery.CommentField, 0.25);
-            play_count_column   = CreateText (BansheeQuery.PlayCountField, 0.15);
-            skip_count_column   = CreateText (BansheeQuery.SkipCountField, 0.15);
-            uri_column          = CreateText (BansheeQuery.UriField, 0.15);
+            play_count_column   = Create (BansheeQuery.PlayCountField, 0.15, false, new ColumnCellPositiveInt (null, true, 2, 5));
+            skip_count_column   = Create (BansheeQuery.SkipCountField, 0.15, false, new ColumnCellPositiveInt (null, true, 2, 5));
+
+            // Construct the URI column specially b/c we want to ellipsize in the middle of the text
+            ColumnCellText uri_cell = new ColumnCellText (BansheeQuery.UriField.PropertyName, true);
+            uri_cell.EllipsizeMode = Pango.EllipsizeMode.Start;
+            uri_column          = Create (BansheeQuery.UriField, 0.15, false, uri_cell);
+            
             mime_type_column    = CreateText (BansheeQuery.MimeTypeField, 0.15);
 
             last_played_column  = Create (BansheeQuery.LastPlayedField, 0.15, false, new ColumnCellDateTime (null, true));
@@ -146,7 +155,7 @@
         {
             cell.Property = field.PropertyName;
             SortableColumn col = new SortableColumn (
-                field.Label,
+                field.ShortLabel,
                 cell,
                 width, field.Name, visible
             );

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/XmlColumnController.cs	Thu Sep 18 23:55:33 2008
@@ -109,9 +109,9 @@
             
             string title = null;
             string sort_key = null;
-            double width = 0.0;
-            int max_width = 0;
-            int min_width = 0;
+            double width = -1;
+            int max_width = -1;
+            int min_width = -1;
             bool visible = true;
             
             string renderer_type = null;
@@ -181,8 +181,14 @@
                 Column column = sort_key == null
                     ? new Column (title, renderer, width, visible)
                     : new SortableColumn (title, renderer, width, sort_key, visible);
-                column.MaxWidth = max_width;
-                column.MinWidth = min_width;
+
+                if (max_width != -1) {
+                    column.MaxWidth = max_width;
+                }
+
+                if (min_width != -1) {
+                    column.MinWidth = min_width;
+                }
                 
                 Add (column);
             }

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellDownloadStatus.cs	Thu Sep 18 23:55:33 2008
@@ -50,16 +50,15 @@
         {
         }
     
-        protected override string Text {
-            get {
-                DownloadedStatusFilter val = (DownloadedStatusFilter) BoundObject;
-                switch (val) {
-                    case DownloadedStatusFilter.Downloaded:       return Catalog.GetString ("Downloaded");
-                    case DownloadedStatusFilter.Both:             return Catalog.GetString ("All Items");
-                    case DownloadedStatusFilter.NotDownloaded:    return Catalog.GetString ("Not Downloaded");
-                }
-                return String.Empty;
+        protected override string GetText (object obj)
+        {
+            DownloadedStatusFilter val = (DownloadedStatusFilter) obj;
+            switch (val) {
+                case DownloadedStatusFilter.Downloaded:       return Catalog.GetString ("Downloaded");
+                case DownloadedStatusFilter.Both:             return Catalog.GetString ("All Items");
+                case DownloadedStatusFilter.NotDownloaded:    return Catalog.GetString ("Not Downloaded");
             }
+            return String.Empty;
         }
     }
 }

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPublished.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPublished.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPublished.cs	Thu Sep 18 23:55:33 2008
@@ -35,6 +35,7 @@
         public ColumnCellPublished (string property, bool expand) : base (property, expand)
         {
             Format = Banshee.Collection.Gui.DateTimeFormat.ShortDate;
+            SetMinMaxStrings (new DateTime (2007, 12, 30));
         }
     }
 }

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs	Thu Sep 18 23:55:33 2008
@@ -50,16 +50,15 @@
         {
         }
     
-        protected override string Text {
-            get {
-                OldNewFilter val = (OldNewFilter) BoundObject;
-                switch (val) {
-                    case OldNewFilter.New:    return Catalog.GetString ("New Items");
-                    case OldNewFilter.Both:   return Catalog.GetString ("All Items");
-                    case OldNewFilter.Old:    return Catalog.GetString ("Old Items");
-                }
-                return String.Empty;
+        protected override string GetText (object obj)
+        {
+            OldNewFilter val = (OldNewFilter) obj;
+            switch (val) {
+                case OldNewFilter.New:    return Catalog.GetString ("New Items");
+                case OldNewFilter.Both:   return Catalog.GetString ("All Items");
+                case OldNewFilter.Old:    return Catalog.GetString ("Old Items");
             }
+            return String.Empty;
         }
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/Column.cs	Thu Sep 18 23:55:33 2008
@@ -43,8 +43,8 @@
         
         private int minWidth = 0;
         private int maxWidth = Int32.MaxValue;
-        private double minRelativeWidth = 0;
-        private double relativeWidth = 0;
+        //private double minRelativeWidth = 0;
+        //private double relativeWidth = 0;
         
         public Column (ColumnDescription description) :
             this (description, new ColumnCellText (description.Property, true))
@@ -93,14 +93,6 @@
         
         public void PackStart (ColumnCell cell)
         {
-            ISizeRequestCell sr_cell = cell as ISizeRequestCell;
-            if (sr_cell != null && sr_cell.RestrictSize) {
-                int w, h;
-                sr_cell.GetSize (out w, out h);
-                MinWidth = w;
-                MaxWidth = w;
-            }
-            
             cells.Insert (0, cell);
         }
         
@@ -138,26 +130,72 @@
             get { return header_cell; }
             set { header_cell = value; }
         }
+
+        public void CalculateWidths (Pango.Layout layout, bool headerVisible, int headerHeight)
+        {
+            bool min_was_zero = MinWidth == 0;
+            bool was_size_req = false;
+            ISizeRequestCell sr_cell = cells[0] as ISizeRequestCell;
+            if (sr_cell != null && sr_cell.RestrictSize) {
+                int min_w, max_w;
+                sr_cell.GetWidthRange (layout, out min_w, out max_w);
+                MinWidth = min_w == -1 ? MinWidth : min_w;
+                MaxWidth = max_w == -1 ? MaxWidth : max_w;
+                was_size_req = true;
+            }
+
+            if (headerVisible && (min_was_zero || was_size_req) && !String.IsNullOrEmpty (Title)) {
+                int w, h;
+                layout.SetText (Title);
+                //column_layout.SetText ("\u2026"); // ellipsis char
+                layout.GetPixelSize (out w, out h);
+
+                // Pretty sure the 3* is needed here only b/c of the " - 8" in ColumnCellText;
+                // See TODO there
+                w += 3 * ColumnHeaderCellText.Spacing;
+                if (this is ISortableColumn) {
+                    w += ColumnHeaderCellText.GetArrowWidth (headerHeight);
+                }
+
+                MinWidth = Math.Max (MinWidth, w);
+
+                // If the min/max are sufficiently close (arbitrarily choosen as < 8px) then
+                // make them equal, so that the column doesn't appear resizable but in reality is on barely.
+                if (MaxWidth - MinWidth < 8) {
+                    MinWidth = MaxWidth;
+                }
+            }
+        }
         
         public int MinWidth {
             get { return minWidth; }
-            set { minWidth = value; }
+            set {
+                minWidth = value;
+                if (value > maxWidth) {
+                    maxWidth = value;
+                }
+            }
         }
 
-        internal double MinRelativeWidth {
+        /*internal double MinRelativeWidth {
             get { return minRelativeWidth; }
             set { minRelativeWidth = value; }
-        }
+        }*/
         
         public int MaxWidth {
             get { return maxWidth; }
-            set { maxWidth = value; }
+            set {
+                maxWidth = value;
+                if (value < minWidth) {
+                    minWidth = value;
+                }
+            }
         }
 
-        public double RelativeWidth {
+        /*public double RelativeWidth {
             get { return relativeWidth; }
             set { relativeWidth = value; }
-        }
+        }*/
 
         public string Id {
             get { return StringUtil.CamelCaseToUnderCase (GetCell (0).Property); }

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellCheckBox.cs	Thu Sep 18 23:55:33 2008
@@ -87,10 +87,9 @@
             return true;
         }
         
-        public void GetSize (out int width, out int height)
+        public void GetWidthRange (Pango.Layout layout, out int min, out int max)
         {
-            width = 2 * Xpad + Size;
-            height = 2 * Ypad + Size;
+            min = max = 2 * Xpad + Size;
         }
         
         private bool restrict_size = true;

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellRating.cs	Thu Sep 18 23:55:33 2008
@@ -44,6 +44,7 @@
         
         public ColumnCellRating (string property, bool expand) : base (property, expand)
         {
+            Xpad = 0;
         }
             
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
@@ -98,10 +99,9 @@
             return true;
         }
         
-        public void GetSize (out int width, out int height)
+        public void GetWidthRange (Pango.Layout layout, out int min, out int max)
         {
-            width = renderer.Width;
-            height = renderer.Height;
+            min = max = renderer.Width;
         }
         
         private int RatingFromPosition (double x)

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs	Thu Sep 18 23:55:33 2008
@@ -37,6 +37,8 @@
 {
     public class ColumnCellText : ColumnCell, ISizeRequestCell, ITextCell
     {
+        internal const int Spacing = 4;
+
         public delegate string DataHandler ();
     
         private Pango.Weight font_weight = Pango.Weight.Normal;
@@ -45,27 +47,48 @@
         private double opacity = 1.0;
         private int text_width;
         private int text_height;
+        private string text_format = null;
         
         public ColumnCellText (string property, bool expand) : base (property, expand)
         {
         }
+
+        protected void SetMinMaxStrings (object min_max)
+        {
+            SetMinMaxStrings (min_max, min_max);
+        }
+        
+        protected void SetMinMaxStrings (object min, object max)
+        {
+            // Set the min/max strings from the min/max objects
+            min_string = GetText (min);
+            max_string = GetText (max);
+            RestrictSize = true;
+        }
     
         public override void Render (CellContext context, StateType state, double cellWidth, double cellHeight)
         {
-            string text = Text;
+            string text = GetText (BoundObject);
             if (String.IsNullOrEmpty (text)) {
                 return;
             }
-        
+
+            // TODO why doesn't Spacing (eg 4 atm) work here instead of 8?  Rendering
+            // seems to be off when changed to Spacing/4
             context.Layout.Width = (int)((cellWidth - 8) * Pango.Scale.PangoScale);
             context.Layout.FontDescription.Weight = font_weight;
             context.Layout.Ellipsize = EllipsizeMode;
             context.Layout.Alignment = alignment;
+
+            if (text_format == null) {
+                context.Layout.SetText (text);
+            } else {
+                context.Layout.SetText (String.Format (text_format, text));
+            }
             
-            context.Layout.SetText (text);
             context.Layout.GetPixelSize (out text_width, out text_height);
             
-            context.Context.MoveTo (4, ((int)cellHeight - text_height) / 2);
+            context.Context.MoveTo (Spacing, ((int)cellHeight - text_height) / 2);
             Cairo.Color color = context.Theme.Colors.GetWidgetColor (
                 context.TextAsForeground ? GtkColorClass.Foreground : GtkColorClass.Text, state);
             color.A = (!context.Sensitive) ? 0.3 : opacity;
@@ -74,9 +97,13 @@
             PangoCairoHelper.ShowLayout (context.Context, context.Layout);
         }
         
-        protected virtual string Text {
-            get { return BoundObject == null ? String.Empty : BoundObject.ToString (); }
+        protected virtual string GetText (object obj)
+        {
+            return obj == null ? String.Empty : obj.ToString ();
         }
+
+        private string min_string;
+        private string max_string;
         
         protected int TextWidth {
             get { return text_width; }
@@ -85,6 +112,11 @@
         protected int TextHeight {
             get { return text_height; }
         }
+
+        public string TextFormat {
+            get { return text_format; }
+            set { text_format = value; }
+        }
         
         protected Pango.Alignment Alignment {
             get { return alignment; }
@@ -116,34 +148,35 @@
             return row_height + 8;
         }
 
+
         #region ISizeRequestCell implementation 
         
-        public void GetSize (out int width, out int height)
+        public void GetWidthRange (Pango.Layout layout, out int min, out int max)
         {
-            if (get_size_request != null) {
-                get_size_request (out width, out height);
-            } else {
-                // Should never really get here, because RestrictSize should return false
-                width = height = 0;
+            int height;
+            min = max = -1;
+            
+            if (!String.IsNullOrEmpty (min_string)) {
+                layout.SetText (min_string);
+                layout.GetPixelSize (out min, out height);
+                min += 2*Spacing;
+                //Console.WriteLine ("for {0} got min {1} for {2}", this, min, min_string);
+            }
+
+            if (!String.IsNullOrEmpty (max_string)) {
+                layout.SetText (max_string);
+                layout.GetPixelSize (out max, out height);
+                max += 2*Spacing;
+                //Console.WriteLine ("for {0} got max {1} for {2}", this, max, max_string);
             }
         }
         
         private bool restrict_size = false;
         public bool RestrictSize {
-            get { return restrict_size && get_size_request != null; }
+            get { return restrict_size; }
             set { restrict_size = value; }
         }
         
         #endregion
-        
-        public delegate void GetSizeRequestHandler (out int width, out int height);
-        private GetSizeRequestHandler get_size_request;
-        public GetSizeRequestHandler GetSizeHandler {
-            get { return get_size_request; }
-            set {
-                get_size_request = value;
-                RestrictSize = value != null;
-            }
-        }
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnHeaderCellText.cs	Thu Sep 18 23:55:33 2008
@@ -38,8 +38,8 @@
         
         private DataHandler data_handler;
         private bool has_sort;
-        
-        public ColumnHeaderCellText (DataHandler data_handler) : base(null, true)
+
+        public ColumnHeaderCellText (DataHandler data_handler) : base (null, true)
         {
             this.data_handler = data_handler;
         }
@@ -51,26 +51,33 @@
             }
             
             if (!has_sort) {
-                base.Render (context, state, cellWidth - 10, cellHeight);
+                base.Render (context, state, cellWidth, cellHeight);
                 return;
             }
-            
-            Gdk.Rectangle alloc = new Gdk.Rectangle ();
-            alloc.Width = (int)(cellHeight / 3.0);
-            alloc.Height = (int)((double)alloc.Width / 1.6);
-            alloc.X = (int)cellWidth - alloc.Width - 10;
-            alloc.Y = ((int)cellHeight - alloc.Height) / 2;
-            
-            base.Render (context, state, cellWidth - 2 * alloc.Width - 10, cellHeight);
-            
+
+            Gdk.Rectangle arrow_alloc = new Gdk.Rectangle ();
+            arrow_alloc.Width = (int)(cellHeight / 3.0);
+            arrow_alloc.Height = (int)((double)arrow_alloc.Width / 1.6);
+            arrow_alloc.X = (int)cellWidth - arrow_alloc.Width - Spacing;
+            arrow_alloc.Y = ((int)cellHeight - arrow_alloc.Height) / 2;
+
+            double textWidth = arrow_alloc.X - Spacing;
+            if (textWidth > 0) {
+                context.Context.Rectangle (0, 0, textWidth, cellHeight);
+                context.Context.Clip ();
+                base.Render (context, state, textWidth, cellHeight);
+                context.Context.ResetClip ();
+            }
+
             SortType sort_type = ((ISortableColumn)data_handler ()).SortType;
             if (sort_type != SortType.None) {
-                context.Theme.DrawArrow (context.Context, alloc, sort_type);
+                context.Theme.DrawArrow (context.Context, arrow_alloc, sort_type);
             }
         }
         
-        protected override string Text {
-            get { return data_handler ().Title; }
+        protected override string GetText (object obj)
+        {
+            return data_handler ().Title;
         }
         
         public bool HasSort {
@@ -78,15 +85,9 @@
             set { has_sort = value; }
         }
         
-        public int MinWidth {
-            get {
-                int min_width = data_handler ().MinWidth + 20;
-                if (HasSort) {
-                    min_width += 20;
-                }
-                return min_width;
-            }
+        public static int GetArrowWidth (int headerHeight)
+        {
+            return (int)(headerHeight / 3.0) + Spacing;
         }
-
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IHeaderCell.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IHeaderCell.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/IHeaderCell.cs	Thu Sep 18 23:55:33 2008
@@ -32,6 +32,5 @@
 {
     public interface IHeaderCell
     {
-        int MinWidth { get; }
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ISizeRequestCell.cs	Thu Sep 18 23:55:33 2008
@@ -34,6 +34,6 @@
     public interface ISizeRequestCell
     {
         bool RestrictSize { get; set; }
-        void GetSize (out int width, out int height);
+        void GetWidthRange (Pango.Layout layout, out int min_width, out int max_width);
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs	Thu Sep 18 23:55:33 2008
@@ -92,14 +92,7 @@
                 }
                 
                 // If we don't already have a MinWidth set, use the width of our Title text
-                if (column.MinWidth == 0) {
-                    int w;
-                    int h;
-                    column_layout.SetText (column.Title);
-                    column_layout.GetPixelSize (out w, out h);
-                    column.MinWidth = w;
-                }
-                
+                column.CalculateWidths (column_layout, HeaderVisible, HeaderHeight);
                 column_cache[i] = new CachedColumn ();
                 column_cache[i].Column = column;
                 column_cache[i].Index = i;
@@ -166,17 +159,16 @@
                         }
                     }
                 }
-                
-                int min_width = column_cache[i].Column.MinWidth;
-                IHeaderCell header_cell = column_cache[i].Column.HeaderCell as IHeaderCell;
-                if (header_cell != null) {
-                    min_width = header_cell.MinWidth;
-                }
-                min_header_width += column_cache[i].MinWidth = Math.Max (min_width, column_cache[i].Column.MinWidth);
-                column_cache[i].MaxWidth = Math.Max (column_cache[i].Column.MaxWidth, column_cache[i].MinWidth);
+
+                column_cache[i].Column.CalculateWidths (column_layout, HeaderVisible, HeaderHeight);
+                column_cache[i].MaxWidth = column_cache[i].Column.MaxWidth;
+                column_cache[i].MinWidth = column_cache[i].Column.MinWidth;
+                min_header_width += column_cache[i].MinWidth;
             }
-            
-            if (min_header_width >= header_interaction_alloc.Width) {
+
+            if (column_cache.Length == 1) {
+                column_cache[0].Column.Width = 1.0;
+            } else if (min_header_width >= header_interaction_alloc.Width) {
                 header_width = min_header_width;
                 resizable = false;
                 for (int i = 0; i < column_cache.Length; i++) {
@@ -313,10 +305,16 @@
         {
             CachedColumn resizing_column = column_cache[resizing_column_index];
             double resize_delta = x - resizing_column.ResizeX2;
-            
+
+            // Make sure the resize_delta won't make us smaller than the min
             if (resizing_column.Width + resize_delta < resizing_column.MinWidth) {
                 resize_delta = resizing_column.MinWidth - resizing_column.Width;
             }
+
+            // Make sure the resize_delta won't make us bigger than the max
+            if (resizing_column.Width + resize_delta > resizing_column.MaxWidth) {
+                resize_delta = resizing_column.MaxWidth - resizing_column.Width;
+            }
             
             if (resize_delta == 0) {
                 return;
@@ -339,7 +337,8 @@
             if (resize_delta > total_elastic_width) {
                 resize_delta = total_elastic_width;
             }
-            
+
+            // Convert to a proprotional width
             resize_delta = sign * resize_delta / (double)header_width;
             
             for (int i = resizing_column_index + 1; i < column_cache.Length; i++) {
@@ -347,7 +346,7 @@
             }
             
             resizing_column.Column.Width += resize_delta;
-        
+
             RegenerateColumnCache ();
             QueueDraw ();
         }
@@ -369,7 +368,7 @@
                     return column_cache[i].Column;
                 }
             }
-            
+
             return null;
         }
         

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs	Thu Sep 18 23:55:33 2008
@@ -188,6 +188,10 @@
                 case Gdk.Key.KP_Enter:
                     handled = ActivateSelection ();
                     break;
+
+                case Gdk.Key.Escape:
+                    handled = CancelColumnDrag ();
+                    break;
                 
                 case Gdk.Key.space:
                     if (Selection != null && Selection.FocusedIndex != 1) {
@@ -343,7 +347,7 @@
             }
             
             Gtk.Drag.SourceUnset (this);
-            
+
             Column column = GetColumnForResizeHandle (x);
             if (column != null) {
                 resizing_column_index = GetCachedColumnForColumn (column).Index;
@@ -435,12 +439,8 @@
                 GdkWindow.Cursor = null;
                 return true;
             }
-            
-            if (pressed_column_index >= 0 && pressed_column_is_dragging) {
-                pressed_column_is_dragging = false;
-                pressed_column_index = -1;
-                GdkWindow.Cursor = null;
-                QueueDraw ();
+
+            if (CancelColumnDrag ()) {
                 return true;
             }
             
@@ -454,7 +454,7 @@
 
             return true;
         }
-        
+
         private bool OnHeaderButtonRelease (Gdk.EventButton evnt)
         {
             if (pressed_column_index >= 0 && pressed_column_index < column_cache.Length) {
@@ -540,9 +540,9 @@
             if (OnMotionNotifyEvent (x)) {
                 return true;
             }
-            
-            GdkWindow.Cursor = (resizing_column_index >= 0 || GetColumnForResizeHandle (x) != null) &&
-                header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) 
+
+            GdkWindow.Cursor = header_interaction_alloc.Contains ((int)evnt.X, (int)evnt.Y) && 
+                (resizing_column_index >= 0 || GetColumnForResizeHandle (x) != null)
                 ? resize_x_cursor 
                 : null;
             
@@ -575,9 +575,11 @@
                     // Moving from right to left
                     reorder = pressed_column_x_drag <= swap_column_c.X1 + swap_column_c.Width / 2;
                 } else if (swap_column_c.Index > pressed_column_index) {
-                    // Moving from left to right
-                    reorder = pressed_column_x_drag + column_cache[pressed_column_index].Width >= 
-                        swap_column_c.X1 + swap_column_c.Width / 2;
+                    if (column_cache.Length > pressed_column_index && pressed_column_index >= 0) {
+                        // Moving from left to right
+                        reorder = pressed_column_x_drag + column_cache[pressed_column_index].Width >= 
+                            swap_column_c.X1 + swap_column_c.Width / 2;
+                    }
                 }
                 
                 if (reorder) {
@@ -629,6 +631,18 @@
                 }
             }
         }
+
+        private bool CancelColumnDrag ()
+        {
+            if (pressed_column_index >= 0 && pressed_column_is_dragging) {
+                pressed_column_is_dragging = false;
+                pressed_column_index = -1;
+                GdkWindow.Cursor = null;
+                QueueDraw ();
+                return true;
+            }
+            return false;
+        }
         
         protected int GetRowAtY (int y)
         {

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryField.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryField.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryField.cs	Thu Sep 18 23:55:33 2008
@@ -61,6 +61,12 @@
             set { label = value; }
         }
 
+        private string short_label;
+        public string ShortLabel {
+            get { return short_label ?? label; }
+            set { short_label = value; }
+        }
+
         private string [] aliases;
         public string [] Aliases {
             get { return aliases; }



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