banshee r3379 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.Collection src/Core/Banshee.Services/Banshee.Collection.Database src/Core/Banshee.Services/Banshee.Playlist src/Core/Banshee.Services/Banshee.SmartPlaylist src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.ThickClient/Banshee.Gui src/Libraries/Hyena src/Libraries/Hyena/Hyena.Data src/Libraries/Hyena/Hyena.Data.Sqlite



Author: gburt
Date: Wed Mar  5 01:42:12 2008
New Revision: 3379
URL: http://svn.gnome.org/viewvc/banshee?rev=3379&view=rev

Log:
2008-03-04  Gabriel Burt  <gabriel burt gmail com>

	This commit fixes a long standing bug in trunk - selections now persist
	across source reloads (assuming the tracks are still in the source/not
	filtered).

	* src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs:
	Add a bool CachesJoinTableEntries property so Smart Playlists can use the
	join table but fill the CoreCache with TrackIDS not EntryIDS - needed,
	since their EntryIDs don't last long b/c they are wiped/created anew every
	time its Reloaded.

	* src/Core/Banshee.Services/Banshee.Collection/BansheeListModel.cs: Don't
	clear the selection on reload.

	* src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:
	Override CachesJoinTableEntries to false.

	* src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs:
	* src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs: Check
	model.CachesJoinTableEntries instead of JoinTable != null.

	* src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs: Whitespace.

	* src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableDatabaseModel.cs:
	Inherit from ISelectable and add CachesJoinTableEntries property. 

	* src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs: SaveSelection
	before a Reload and RestoreSelection afterward.

	* src/Libraries/Hyena/Hyena.Data/ModelCache.cs:
	* src/Libraries/Hyena/Hyena.Data/ArrayModelCache.cs:
	* src/Libraries/Hyena/Hyena.Data/DictionaryModelCache.cs: Update to use
	Int64s where appropriate.

	* src/Libraries/Hyena/Hyena.Data/IListModel.cs: Inherit from ISelectable.

	* src/Libraries/Hyena/Hyena.Data/ModelSelection.cs: Comment out
	unimplemented IndexOf method.

	* src/Libraries/Hyena/Makefile.am: New ISelectable interface.


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BansheeListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableDatabaseModel.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/ArrayModelCache.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/DictionaryModelCache.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/IListModel.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelCache.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelSelection.cs
   trunk/banshee/src/Libraries/Hyena/Makefile.am

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/AlbumListDatabaseModel.cs	Wed Mar  5 01:42:12 2008
@@ -43,7 +43,7 @@
         private readonly BansheeModelProvider<LibraryAlbumInfo> provider;
         private readonly BansheeModelCache<LibraryAlbumInfo> cache;
         private readonly TrackListDatabaseModel track_model;
-        private int count;
+        private long count;
         private string artist_id_filter_query;
         private string reload_fragment;
         
@@ -79,8 +79,8 @@
                                     WHERE CoreCache.ModelID = {0} AND
                                           CoreCache.ItemId = {2})",
                             track_model.CacheId,
-                            track_model.JoinFragment,
-                            track_model.JoinTable == null
+                            track_model.CachesJoinTableEntries ? track_model.JoinFragment : null,
+                            (!track_model.CachesJoinTableEntries)
                                 ? "CoreTracks.TrackID"
                                 : String.Format ("{0}.{1} AND CoreTracks.TrackID = {0}.{2}", track_model.JoinTable, track_model.JoinPrimaryKey, track_model.JoinColumn)
                             ),
@@ -127,7 +127,7 @@
         }
 
         public override int Count { 
-            get { return count; }
+            get { return (int) count; }
         }
 
         // Implement ICacheableModel
@@ -147,5 +147,6 @@
         public string JoinFragment { get { return null; } }
         public string JoinPrimaryKey { get { return null; } }
         public string JoinColumn { get { return null; } }
+        public bool CachesJoinTableEntries { get { return false; } }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/ArtistListDatabaseModel.cs	Wed Mar  5 01:42:12 2008
@@ -43,7 +43,7 @@
         private readonly BansheeModelCache<LibraryArtistInfo> cache;
         private readonly TrackListDatabaseModel track_model;
         private string reload_fragment;
-        private int count;
+        private long count;
         
         private readonly ArtistInfo select_all_artist = new ArtistInfo(null);
         
@@ -75,8 +75,8 @@
                                       CoreCache.ItemID = CoreTracks.TrackID AND
                                       CoreArtists.ArtistID = CoreTracks.ArtistID)",*/
                         track_model.CacheId,
-                        track_model.JoinFragment,
-                        track_model.JoinTable == null
+                        track_model.CachesJoinTableEntries ? track_model.JoinFragment : null,
+                        (!track_model.CachesJoinTableEntries)
                             ? "CoreTracks.TrackID"
                             : String.Format ("{0}.{1} AND CoreTracks.TrackID = {0}.{2}", track_model.JoinTable, track_model.JoinPrimaryKey, track_model.JoinColumn)
                     ) : null
@@ -103,7 +103,7 @@
         }
 
         public override int Count { 
-            get { return count; }
+            get { return (int) count; }
         }
 
         // Implement ICacheableModel
@@ -121,5 +121,6 @@
         public string JoinFragment { get { return null; } }
         public string JoinPrimaryKey { get { return null; } }
         public string JoinColumn { get { return null; } }
+        public bool CachesJoinTableEntries { get { return false; } }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs	Wed Mar  5 01:42:12 2008
@@ -409,7 +409,7 @@
         public string TrackIdsSql {
             get {
                 if (track_ids_sql == null) {
-                    if (JoinTable == null) {
+                    if (!CachesJoinTableEntries) {
                         track_ids_sql = "SELECT ItemID FROM CoreCache WHERE ModelID = ? LIMIT ?, ?";
                     } else {
                         track_ids_sql = String.Format (
@@ -422,7 +422,11 @@
             }
         }
 
-
+        private bool caches_join_table_entries = false;
+        public bool CachesJoinTableEntries {
+            get { return caches_join_table_entries; }
+            set { caches_join_table_entries = value; }
+        }
 
         // Implement ICacheableModel
         public int FetchCount {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BansheeListModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BansheeListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BansheeListModel.cs	Wed Mar  5 01:42:12 2008
@@ -62,8 +62,6 @@
         
         protected virtual void OnReloaded ()
         {
-            selection.Clear ();
-
             Banshee.Base.ThreadAssist.ProxyToMain (delegate {
                 EventHandler handler = Reloaded;
                 if(handler != null) {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs	Wed Mar  5 01:42:12 2008
@@ -72,6 +72,10 @@
             get { return "EntryID"; }
         }
 
+        protected virtual bool CachesJoinTableEntries {
+            get { return true; }
+        }
+
         public int? DbId {
             get { return dbid; }
             protected set {
@@ -82,6 +86,7 @@
                 track_model.JoinTable = TrackJoinTable;
                 track_model.JoinPrimaryKey = JoinPrimaryKey;
                 track_model.JoinColumn = "TrackID";
+                track_model.CachesJoinTableEntries = CachesJoinTableEntries;
                 track_model.Condition = String.Format (TrackCondition, dbid);
                 AfterInitialized ();
 

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Playlist/PlaylistSource.cs	Wed Mar  5 01:42:12 2008
@@ -251,7 +251,7 @@
         HyenaSqliteCommand last_add_range_command = null;
         protected virtual void AddTrackRange (TrackListDatabaseModel from, RangeCollection.Range range)
         {
-            last_add_range_command = (from.JoinTable == null)
+            last_add_range_command = (!from.CachesJoinTableEntries)
                 ? add_track_range_command
                 : from == last_add_range_from_model
                     ? last_add_range_command

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	Wed Mar  5 01:42:12 2008
@@ -85,6 +85,10 @@
             get { return "CoreSmartPlaylistEntries"; }
         }
 
+        protected override bool CachesJoinTableEntries {
+            get { return false; }
+        }
+
         // Custom properties
         private QueryNode condition;
         public QueryNode ConditionTree {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs	Wed Mar  5 01:42:12 2008
@@ -305,7 +305,7 @@
         protected HyenaSqliteCommand RateTrackRangeCommand {
             get {
                 if (rate_track_range_command == null) {
-                    if (track_model.JoinTable != null) {
+                    if (track_model.CachesJoinTableEntries) {
                         rate_track_range_command = new HyenaSqliteCommand (String.Format (@"
                             UPDATE CoreTracks SET Rating = ?, DateUpdatedStamp = ? WHERE
                                 TrackID IN (SELECT TrackID FROM {0} WHERE 

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs	Wed Mar  5 01:42:12 2008
@@ -262,7 +262,6 @@
             TrackSelector.TrackSelectionProxy.Selection.Clear ();
         }
 
-
         private void OnTrackContextMenu (object o, EventArgs args)
         {
             ResetRating ();

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableDatabaseModel.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableDatabaseModel.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableDatabaseModel.cs	Wed Mar  5 01:42:12 2008
@@ -32,7 +32,7 @@
 
 namespace Hyena.Data.Sqlite
 {
-    public interface ICacheableDatabaseModel : ICacheableModel
+    public interface ICacheableDatabaseModel : ICacheableModel, ISelectable
     {
         string ReloadFragment { get; }
         string SelectAggregates { get; }
@@ -40,5 +40,6 @@
         string JoinFragment { get; }
         string JoinPrimaryKey { get; }
         string JoinColumn { get; }
+        bool CachesJoinTableEntries { get; }
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs	Wed Mar  5 01:42:12 2008
@@ -41,12 +41,17 @@
         private HyenaSqliteCommand select_single_command;
         private HyenaSqliteCommand select_first_command;
         private HyenaSqliteCommand count_command;
+        private HyenaSqliteCommand delete_selection_command;
+        private HyenaSqliteCommand save_selection_command;
+        private HyenaSqliteCommand get_selection_command;
 
         private string reload_sql;
-        private int uid;
-        private int rows;
+        private long uid;
+        private long selection_uid;
+        private long rows;
         // private bool warm;
-        private int first_order_id;
+        private bool first_reload = true;
+        private long first_order_id;
 
         public delegate void AggregatesUpdatedEventHandler (IDataReader reader);
         public event AggregatesUpdatedEventHandler AggregatesUpdated;
@@ -64,7 +69,7 @@
             CheckCacheTable ();
 
             if (model.SelectAggregates != null) {
-                if (model.JoinFragment != null) {
+                if (model.CachesJoinTableEntries) {
                     count_command = new HyenaSqliteCommand (String.Format (@"
                         SELECT count(*), {0} FROM {1}{2} j
                         WHERE j.{4} IN (SELECT ItemID FROM {3} WHERE ModelID = ?)
@@ -89,9 +94,10 @@
                 ));
             }
 
-            FindOrCreateCacheModelId (String.Format ("{0}-{1}", uuid, typeof(T).Name));
+            uid = FindOrCreateCacheModelId (String.Format ("{0}-{1}", uuid, typeof(T).Name));
+            selection_uid = FindOrCreateCacheModelId (String.Format ("{0}-{1}-Selection", uuid, typeof(T).Name));
 
-            if (model.JoinFragment != null) {
+            if (model.CachesJoinTableEntries) {
                 select_range_command = new HyenaSqliteCommand (
                     String.Format (@"
                         SELECT {0} FROM {1}
@@ -167,6 +173,19 @@
                 )
             );
 
+            delete_selection_command = new HyenaSqliteCommand (String.Format (
+                "DELETE FROM {0} WHERE ModelID = {1}", CacheTableName, selection_uid
+            ));
+            
+            save_selection_command = new HyenaSqliteCommand (String.Format (
+                "INSERT INTO {0} SELECT null, {1}, ItemID FROM {0} WHERE ModelID = {2} LIMIT ?, ?",
+                CacheTableName, selection_uid, uid
+            ));
+
+            get_selection_command = new HyenaSqliteCommand (String.Format (
+                "SELECT OrderID FROM {0} WHERE ModelID = {1} AND ItemID IN (SELECT ItemID FROM {0} WHERE ModelID = {2})",
+                CacheTableName, uid, selection_uid
+            ));
         }
 
         public bool Warm {
@@ -174,11 +193,11 @@
             get { return false; }
         }
 
-        public int Count {
+        public long Count {
             get { return rows; }
         }
 
-        public int CacheId {
+        public long CacheId {
             get { return uid; }
         }
 
@@ -189,27 +208,33 @@
         protected virtual string CacheTableName {
             get { return "HyenaCache"; }
         }
+
+        private long FirstOrderId {
+            get {
+                if (first_order_id == -1) {
+                    first_order_id = connection.Query<long> (select_first_command);
+                }
+                return first_order_id;
+             }
+        }
         
-        public int IndexOf (int item_id)
+        public long IndexOf (long item_id)
         {
             if (rows == 0) {
                 return -1;
             }
             select_single_command.ApplyValues (item_id);
-            int target_id = connection.Query<int> (select_single_command);
+            long target_id = connection.Query<long> (select_single_command);
             if (target_id == 0) {
                 return -1;
             }
-            if (first_order_id == -1) {
-                first_order_id = connection.Query<int> (select_first_command);
-            }
-            return target_id - first_order_id;
+            return target_id - FirstOrderId;
         }
 
         private HyenaSqliteCommand last_reload_command;
         private string last_reload_fragment;
 
-        public override int Reload ()
+        public override long Reload ()
         {
             if (last_reload_fragment == model.ReloadFragment) {
                 last_reload_command = last_reload_command;
@@ -218,6 +243,10 @@
                 last_reload_command = new HyenaSqliteCommand (reload_sql + last_reload_fragment);
             }
 
+            if (!first_reload) {
+                SaveSelection ();
+            }
+
             Clear ();
 
             //using (new Timer (String.Format ("Generating cache table for {0}", model))) {
@@ -225,17 +254,56 @@
             //}
             first_order_id = -1;
             UpdateAggregates ();
+
+            if (!first_reload) {
+                RestoreSelection ();
+            } else {
+                first_reload = false;
+            }
+
             return rows;
         }
 
-        protected override void FetchSet (int offset, int limit)
+        private void SaveSelection ()
+        {
+            connection.Execute (delete_selection_command);
+
+            if (model.Selection.Count > 0) {
+                foreach (Hyena.Collections.RangeCollection.Range range in model.Selection.Ranges) {
+                    connection.Execute (save_selection_command.ApplyValues (range.Start, range.End - range.Start + 1));
+                }
+            }
+        }
+
+        private void RestoreSelection ()
+        {
+            model.Selection.Clear (false);
+            long selected_id = -1;
+            long first_id = FirstOrderId;
+            using (IDataReader reader = connection.Query (get_selection_command)) {
+                while (reader.Read ()) {
+                    selected_id = Convert.ToInt64 (reader[0]);
+                    selected_id -= first_id;
+                    model.Selection.QuietSelect ((int)selected_id);
+                }
+            }
+
+            // Trigger a model Changed event
+            if (selected_id == -1) {
+                model.Selection.Clear ();
+            } else {
+                model.Selection.Select ((int)selected_id);
+            }
+        }
+
+        protected override void FetchSet (long offset, long limit)
         {
             //using (new Timer (String.Format ("Fetching set for {0}", model))) {
                 select_range_command.ApplyValues (offset, limit);
                 using (IDataReader reader = connection.Query (select_range_command)) {
                     while (reader.Read ()) {
                         if (!ContainsKey (offset)) {
-                            Add (offset, provider.Load (reader, offset));
+                            Add (offset, provider.Load (reader, (int)offset));
                         }
                         offset++;
                      }
@@ -247,7 +315,7 @@
         {
             using (IDataReader reader = connection.Query (count_command.ApplyValues (uid))) {
                 if (reader.Read ()) {
-                    rows = Convert.ToInt32 (reader[0]);
+                    rows = Convert.ToInt64 (reader[0]);
 
                     AggregatesUpdatedEventHandler handler = AggregatesUpdated;
                     if (handler != null) {
@@ -257,25 +325,27 @@
             }
         }
         
-        private void FindOrCreateCacheModelId (string id)
+        private long FindOrCreateCacheModelId (string id)
         {
-            uid = connection.Query<int> (String.Format (
+            long model_id = connection.Query<long> (String.Format (
                 "SELECT CacheID FROM {0} WHERE ModelID = '{1}'",
                 CacheModelsTableName, id
             ));
 
-            if (uid == 0) {
+            if (model_id == 0) {
                 //Console.WriteLine ("Didn't find existing cache for {0}, creating", id);
-                uid = connection.Execute (new HyenaSqliteCommand (String.Format (
+                model_id = connection.Execute (new HyenaSqliteCommand (String.Format (
                     "INSERT INTO {0} (ModelID) VALUES (?)", CacheModelsTableName
                     ), id
                 ));
             } else {
                 //Console.WriteLine ("Found existing cache for {0}: {1}", id, uid);
                 //warm = true;
-                Clear ();
-                UpdateAggregates ();
+                //Clear ();
+                //UpdateAggregates ();
             }
+
+            return model_id;
         }
 
         private static string checked_cache_table;

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/ArrayModelCache.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data/ArrayModelCache.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/ArrayModelCache.cs	Wed Mar  5 01:42:12 2008
@@ -33,21 +33,21 @@
     public abstract class ArrayModelCache<T> : ModelCache<T>
     {
         protected T [] cache;
-        protected int offset = -1;
-        protected int limit = 0;
+        protected long offset = -1;
+        protected long limit = 0;
 
         public ArrayModelCache (ICacheableModel model) : base (model)
         {
             cache = new T [model.FetchCount];
         }
 
-        public override bool ContainsKey (int i)
+        public override bool ContainsKey (long i)
         {
             return (i >= offset &&
                     i <= (offset + limit));
         }
 
-        public override void Add (int i, T item)
+        public override void Add (long i, T item)
         {
             if (cache.Length != model.FetchCount) {
                 cache = new T [model.FetchCount];
@@ -63,7 +63,7 @@
             limit++;
         }
 
-        public override T this [int i] {
+        public override T this [long i] {
             get { return cache [i - offset]; }
         }
 

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/DictionaryModelCache.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data/DictionaryModelCache.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/DictionaryModelCache.cs	Wed Mar  5 01:42:12 2008
@@ -33,24 +33,24 @@
 {
     public abstract class DictionaryModelCache<T> : ModelCache<T>
     {
-        protected Dictionary<int, T> cache;
+        protected Dictionary<long, T> cache;
 
         public DictionaryModelCache (ICacheableModel model) : base (model)
         {
-            cache = new Dictionary<int, T> (model.FetchCount);
+            cache = new Dictionary<long, T> (model.FetchCount);
         }
 
-        public override bool ContainsKey (int i)
+        public override bool ContainsKey (long i)
         {
             return cache.ContainsKey (i);
         }
 
-        public override void Add (int i, T item)
+        public override void Add (long i, T item)
         {
             cache.Add (i, item);
         }
 
-        public override T this [int i] {
+        public override T this [long i] {
             get { return cache [i]; }
         }
 

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/IListModel.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data/IListModel.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/IListModel.cs	Wed Mar  5 01:42:12 2008
@@ -32,7 +32,7 @@
 
 namespace Hyena.Data
 {
-    public interface IListModel<T>
+    public interface IListModel<T> : ISelectable
     {
         event EventHandler Cleared;
         event EventHandler Reloaded;
@@ -42,7 +42,6 @@
         
         T this[int index] { get; }
         int Count { get; }
-        Selection Selection { get; }
     }
     
     public interface IObjectListModel : IListModel<object>

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelCache.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelCache.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelCache.cs	Wed Mar  5 01:42:12 2008
@@ -40,7 +40,7 @@
             this.model = model;
         }
 
-        public virtual T GetValue (int index)
+        public virtual T GetValue (long index)
         {
             if (ContainsKey (index))
                 return this[index];
@@ -54,14 +54,14 @@
         }
         
         // Responsible for fetching a set of items and placing them in the cache
-        protected abstract void FetchSet (int offset, int limit);
+        protected abstract void FetchSet (long offset, long limit);
 
         // Reset the cache and return the total # of items in the model
-        public abstract int Reload ();
+        public abstract long Reload ();
 
-        public abstract bool ContainsKey (int i);
-        public abstract void Add (int i, T item);
-        public abstract T this[int i] { get; }
+        public abstract bool ContainsKey (long i);
+        public abstract void Add (long i, T item);
+        public abstract T this[long i] { get; }
         public abstract void Clear ();
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelSelection.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelSelection.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/ModelSelection.cs	Wed Mar  5 01:42:12 2008
@@ -65,11 +65,11 @@
 
 #region Methods
 
-        public int IndexOf (T value)
+        /*public int IndexOf (T value)
         {
             //selection.IndexOf (model.IndexOf (value));
             return -1;
-        }
+        }*/
 
         public IEnumerator<T> GetEnumerator ()
         {

Modified: trunk/banshee/src/Libraries/Hyena/Makefile.am
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Hyena/Makefile.am	Wed Mar  5 01:42:12 2008
@@ -27,6 +27,7 @@
 	Hyena.Data/IFilterable.cs \
 	Hyena.Data/IListModel.cs \
 	Hyena.Data/IPropertyStoreExpose.cs \
+	Hyena.Data/ISelectable.cs \
 	Hyena.Data/ISortable.cs \
 	Hyena.Data/ISortableColumn.cs \
 	Hyena.Data/ModelCache.cs \



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