banshee r3980 - in trunk/banshee: . data src/Backends/Banshee.GStreamer src/Backends/Banshee.Gnome src/Backends/Banshee.Hal src/Backends/Banshee.Unix src/Clients/Nereid src/Core/Banshee.Core src/Core/Banshee.Core/Banshee.Base src/Core/Banshee.Core/Banshee.Collection src/Core/Banshee.Core/Resources src/Core/Banshee.Services src/Core/Banshee.Services/Banshee.Collection src/Core/Banshee.Services/Banshee.Collection.Database src/Core/Banshee.Services/Banshee.Database src/Core/Banshee.Services/Banshee.Query src/Core/Banshee.ThickClient src/Core/Banshee.ThickClient/Banshee.Gui src/Core/Banshee.ThickClient/Banshee.Sources.Gui src/Core/Banshee.Widgets src/Extensions/Banshee.AudioCd src/Extensions/Banshee.BooScript src/Extensions/Banshee.Bookmarks src/Extensions/Banshee.Daap src/Extensions/Banshee.Lastfm src/Extensions/Banshee.MultimediaKeys src/Extensions/Banshee.NotificationArea src/Extensions/Banshee.NowPlaying src/Extensions/Banshee.PlayQueue src/Extensions/Banshee.Podcast ing src/Extensions/Banshee.Podcasting/Banshee.Podcasting src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Views src/Extensions/Banshee.Podcasting/Resources src/Extensions/Banshee.Sample src/Libraries/Hyena src/Libraries/Hyena.Gui src/Libraries/Hyena.Gui/Hyena.Data.Gui src/Libraries/Hyena.Gui/Hyena.Widgets src/Libraries/Hyena/Hyena.Collections src/Libraries/Hyena/Hyena.Data src/Libraries/Hyena/Hyena.Data.Sqlite src/Libraries/Lastfm src/Libraries/Lastfm.Gui src/Libraries/Migo src/Libraries/Migo/Migo.Syndication src/Libraries/Mono.Media src/Libraries/Mtp src/Libraries/Mtp/Mtp src/Libraries/MusicBrainz



Author: gburt
Date: Sun May 25 19:48:34 2008
New Revision: 3980
URL: http://svn.gnome.org/viewvc/banshee?rev=3980&view=rev

Log:
2008-05-25  Gabriel Burt  <gabriel burt gmail com>

	This patch adds another filter to the podcast browser - the ability to
	filter on all/new/old items.  The default is to only show New Items, in
	keeping with the most common use case of podcast users.  Items are marked
	as old after being played.  They can be marked old manually via the
	Edit menu and track context menu, or by selecting one or more items and
	pressing y.

	* *.mdp: MonoDevelop changed some <Project> attributes across all these.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs:
	Add hack to be able to not handle FeedItem changes when doing bulk ops.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastQuery.cs:
	New class, commented out, will replace BansheeQuery when in podcasting.
	Zero work done on it so far.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs:
	Add another filter list view with three options: All Items, New Items, and
	Old Items.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs:
	Change the Mark as Old keybinding to y (ala gmail archive).  Implement
	mark old/new.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSourceContents.cs:
	Move go Banshee.Podcasting.Gui namespace directory.  Add the all/new/old
	filter view.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSource.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastItemModel.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastFeedModel.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastFeedView.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastItemView.cs:
	Move to namespace directories.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastUnheardFilterView.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs:
	New classes to implement the all/new/old filter.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs:
	Override IncrementPlayCount and set the item as old (if not already set)
	when incremented.  Catch exceptions in processing file w/ taglib#.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs:
	Move PodcastListModel out of here.  Create the all/new/old filter model
	and add it to the FilterModels.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs:
	Moved out of PodcastSource into its own file.

	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs:
	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs:
	DatabaseBrowsableListModel renamed to DatabaseFilterListModel, and
	ItemToFilterValue made protected.

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.mdp:
	* src/Extensions/Banshee.Podcasting/Makefile.am: Reflect new files and
	moevs.

	* src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml: Add
	track actions to the Edit menu (not just the track context menu).

	* src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs:
	Use String.Format not +, properly handle setting a new Paned when one was
	already set (stop listening to old one's events), avoid saving when the
	value hasn't changed.

	* src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs:
	Give parent class a name for us (albumartist) for unique gconf position
	entries

	* src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs:
	Take a name in the ctor so we can save positions in gconf per
	filtered-list type (eg podcast and albumartist, atm).  Go back and
	implement packing the N filter views into Gtk.Paneds.  Refactor
	LayoutLeft/Top code to be the same.

	* src/Core/Banshee.Services/Banshee.Collection/IFilterListModel.cs: New
	interface.

	* src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs:
	Implement Clear.

	* src/Core/Banshee.Services/Banshee.Collection/BrowsableListModel.cs:
	* src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs: Rename,
	made to not require that the filter model itself be database backed (eg
	the all/new/old model is just an in-memory enum model).

	* src/Core/Banshee.Services/Banshee.Collection/BansheeListModel.cs:
	Comment out (should remove) virtual implementations that just threw NIE.

	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs:
	Move ICacheableItem up (to parent class of *TrackInfo).

	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseBrowsableListModel.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs:
	Rename.

	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs:
	Handle the provider.Where clause being empty, add spaces around AND'd
	sql filter fragments from our filtering models.

	* src/Core/Banshee.Services/Banshee.Services.mdp:
	* src/Core/Banshee.Services/Makefile.am: New/moved files.

	* src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs:
	* src/Libraries/Migo/Migo.Syndication/MigoItem.cs:
	* src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs: Add
	using Hyena.Data because ICacheableItem moved there.

	* src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs: Cosmetic
	changes, getting ready to refactor so sources can set/customize the fields
	they can be queried with.

	* src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs:
	* src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs:
	* src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs: Add empty ctor,
	inherit from CacheableItem.

	* src/Core/Banshee.Core/Makefile.am:
	* src/Core/Banshee.Core/Banshee.Core.mdp:
	* src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs: New class,
	just a simple implementation of ICacheableItem.

	* src/Core/Banshee.Core/Resources/translators.xml: Updated.

	* src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs: Check that the
	escaped artist/album strings aren't empty either (not just null).

	* src/Libraries/Mtp/Mtp/MtpDevice.cs: Move LIBMTP_Init into static ctor,
	get rid of internal method that called it; wouldn't want to call it twice.

	* src/Libraries/Hyena/Hyena.Collections/Selection.cs: Add convenience
	properties for FirstIndex and LastIndex.

	* src/Libraries/Hyena/Hyena.mdp:
	* src/Libraries/Hyena/Makefile.am:
	* src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableItem.cs:
	* src/Libraries/Hyena/Hyena.Data/ICacheableItem.cs: Moved here from
	Hyena.Data.Sqlite.

	* src/Libraries/Hyena/Hyena.Data/ICacheableModel.cs: Inherit ISelctable.

	* src/Libraries/Hyena/Hyena.Data/ArrayModelCache.cs:
	* src/Libraries/Hyena/Hyena.Data/ModelCache.cs:
	* src/Libraries/Hyena/Hyena.Data/DictionaryModelCache.cs: Specify that T
	must be ICacheableItem.

	* src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableDatabaseModel.cs:
	Inheritance from ISelectable moved to parent interface.

	* src/Libraries/Hyena/Hyena.Data.Sqlite/SqliteModelCache.cs: When
	restoring the selection across a reload, restore the focused index as
	well, if possible.

	* src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs: If the item to
	bind is null, set the bound object and parent object to null too.

	* src/Libraries/Hyena.Gui/Hyena.Widgets/AccordionPane.cs: New class,
	completely not done (or really started).  Would be great to refactor the
	awesome column sizing code out of ListView so could be used by this.  The
	idea is a new Paned-type widget with N children with min/max/relative
	widths etc all set, and resizing one will resize others to their min
	width, etc.

	* src/Libraries/Migo/Migo.Syndication/FeedItem.cs: Add an index to IsRead
	since we'll be filtering on it a lot.

	* data/mimetypes.txt: Add video/ogg and video/x-theora.


Added:
   trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs   (contents, props changed)
      - copied, changed from r3969, /trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseBrowsableListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs   (contents, props changed)
      - copied, changed from r3969, /trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BrowsableListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/IFilterListModel.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs   (contents, props changed)
      - copied, changed from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastFeedModel.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs   (contents, props changed)
      - copied, changed from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSource.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastFeedView.cs   (props changed)
      - copied unchanged from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastFeedView.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs   (props changed)
      - copied unchanged from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastItemView.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs   (contents, props changed)
      - copied, changed from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSourceContents.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastUnheardFilterView.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastQuery.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AccordionPane.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data/ICacheableItem.cs   (contents, props changed)
      - copied, changed from r3978, /trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableItem.cs
Removed:
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseBrowsableListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BrowsableListModel.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastFeedModel.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastItemModel.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSource.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSourceContents.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastFeedView.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastItemView.cs
   trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableItem.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/data/mimetypes.txt
   trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer.mdp
   trunk/banshee/src/Backends/Banshee.Gnome/Banshee.Gnome.mdp
   trunk/banshee/src/Backends/Banshee.Hal/Banshee.Hal.mdp
   trunk/banshee/src/Backends/Banshee.Unix/Banshee.Unix.mdp
   trunk/banshee/src/Clients/Nereid/Nereid.mdp
   trunk/banshee/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
   trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp
   trunk/banshee/src/Core/Banshee.Core/Makefile.am
   trunk/banshee/src/Core/Banshee.Core/Resources/translators.xml
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BansheeListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp
   trunk/banshee/src/Core/Banshee.Services/Makefile.am
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp
   trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp
   trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.mdp
   trunk/banshee/src/Extensions/Banshee.BooScript/Banshee.BooScript.mdp
   trunk/banshee/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks.mdp
   trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp
   trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp
   trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys.mdp
   trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea.mdp
   trunk/banshee/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.mdp
   trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.mdp
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Makefile.am
   trunk/banshee/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml
   trunk/banshee/src/Extensions/Banshee.Sample/Banshee.Sample.mdp
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp
   trunk/banshee/src/Libraries/Hyena/Hyena.Collections/Selection.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/ICacheableModel.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.mdp
   trunk/banshee/src/Libraries/Hyena/Makefile.am
   trunk/banshee/src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp
   trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp
   trunk/banshee/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
   trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoItem.cs
   trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs
   trunk/banshee/src/Libraries/Migo/Migo.mdp
   trunk/banshee/src/Libraries/Mono.Media/Mono.Media.mdp
   trunk/banshee/src/Libraries/Mtp/Mtp.mdp
   trunk/banshee/src/Libraries/Mtp/Mtp/MtpDevice.cs
   trunk/banshee/src/Libraries/MusicBrainz/MusicBrainz.mdp

Modified: trunk/banshee/data/mimetypes.txt
==============================================================================
--- trunk/banshee/data/mimetypes.txt	(original)
+++ trunk/banshee/data/mimetypes.txt	Sun May 25 19:48:34 2008
@@ -125,5 +125,7 @@
 video/x-nsv
 video/x-ogm+ogg
 video/x-theora+ogg
+video/x-theora
+video/ogg
 x-content/audio-cdda
 x-content/audio-player

Modified: trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer.mdp
==============================================================================
--- trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer.mdp	(original)
+++ trunk/banshee/src/Backends/Banshee.GStreamer/Banshee.GStreamer.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.GStreamer" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.GStreamer" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.MediaEngine.GStreamer" />

Modified: trunk/banshee/src/Backends/Banshee.Gnome/Banshee.Gnome.mdp
==============================================================================
--- trunk/banshee/src/Backends/Banshee.Gnome/Banshee.Gnome.mdp	(original)
+++ trunk/banshee/src/Backends/Banshee.Gnome/Banshee.Gnome.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Gnome" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Gnome" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Gnome" />

Modified: trunk/banshee/src/Backends/Banshee.Hal/Banshee.Hal.mdp
==============================================================================
--- trunk/banshee/src/Backends/Banshee.Hal/Banshee.Hal.mdp	(original)
+++ trunk/banshee/src/Backends/Banshee.Hal/Banshee.Hal.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Hal" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Hal" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Hal" />

Modified: trunk/banshee/src/Backends/Banshee.Unix/Banshee.Unix.mdp
==============================================================================
--- trunk/banshee/src/Backends/Banshee.Unix/Banshee.Unix.mdp	(original)
+++ trunk/banshee/src/Backends/Banshee.Unix/Banshee.Unix.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Unix" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Unix" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Unix" />

Modified: trunk/banshee/src/Clients/Nereid/Nereid.mdp
==============================================================================
--- trunk/banshee/src/Clients/Nereid/Nereid.mdp	(original)
+++ trunk/banshee/src/Clients/Nereid/Nereid.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Nereid" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Nereid" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Nereid" />

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Base/CoverArtSpec.cs	Sun May 25 19:48:34 2008
@@ -71,7 +71,7 @@
             string sm_artist = EscapePart (artist);
             string sm_album = EscapePart (album);
             
-            return sm_artist == null || sm_album == null 
+            return String.IsNullOrEmpty (sm_artist) || String.IsNullOrEmpty (sm_album)
                 ? null 
                 : String.Format ("{0}{1}{2}", sm_artist, asUriPart ? "/" : "-", sm_album); 
         }

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/AlbumInfo.cs	Sun May 25 19:48:34 2008
@@ -33,7 +33,7 @@
 
 namespace Banshee.Collection
 {
-    public class AlbumInfo 
+    public class AlbumInfo : CacheableItem
     {
         private string title;
         private string artist_name;
@@ -41,6 +41,10 @@
         private DateTime release_date = DateTime.MinValue;
         private string musicbrainz_id;
         
+        public AlbumInfo ()
+        {
+        }
+        
         public AlbumInfo (string title)
         {
             this.title = title;

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/ArtistInfo.cs	Sun May 25 19:48:34 2008
@@ -28,11 +28,15 @@
 
 namespace Banshee.Collection
 {
-    public class ArtistInfo 
+    public class ArtistInfo : CacheableItem
     {
         private string name;
         private string musicbrainz_id;
         
+        public ArtistInfo ()
+        {
+        }
+        
         public ArtistInfo(string name)
         {
             this.name = name;

Added: trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/CacheableItem.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,55 @@
+//
+// CacheableItem.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+using Hyena.Data;
+
+namespace Banshee.Collection
+{
+    public class CacheableItem : ICacheableItem
+    {
+    
+#region Implement ICacheableItem
+
+        private long cache_entry_id;
+        public long CacheEntryId {
+            get { return cache_entry_id; }
+            set { cache_entry_id = value; }
+        }
+
+        private long cache_model_id;
+        public long CacheModelId {
+            get { return cache_model_id; }
+            set { cache_model_id = value; }
+        }
+
+#endregion
+
+    }
+}

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	Sun May 25 19:48:34 2008
@@ -38,7 +38,7 @@
 
 namespace Banshee.Collection
 {
-    public class TrackInfo : ITrackInfo
+    public class TrackInfo : CacheableItem, ITrackInfo
     {
         private SafeUri uri;
         private SafeUri more_info_uri;
@@ -308,7 +308,7 @@
             get { return media_attributes; }
             set { media_attributes = value; }
         }
-        
+
         // Generates a{sv} of self according to http://wiki.xmms2.xmms.se/index.php/Media_Player_Interfaces#.22Metadata.22
         public IDictionary<string, object> GenerateExportable ()
         {

Modified: trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Banshee.Core.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Core" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Core" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Core" />
@@ -70,6 +70,7 @@
     <File name="Banshee.Base/Tests/FileNamePatternTests.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Base/Tests/TaglibReadWriteTests.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Kernel/DelegateJob.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection/CacheableItem.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Project" localcopy="False" refto="Hyena" />

Modified: trunk/banshee/src/Core/Banshee.Core/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Makefile.am	Sun May 25 19:48:34 2008
@@ -18,6 +18,7 @@
 	Banshee.Base/XdgBaseDirectorySpec.cs \
 	Banshee.Collection/AlbumInfo.cs \
 	Banshee.Collection/ArtistInfo.cs \
+	Banshee.Collection/CacheableItem.cs \
 	Banshee.Collection/FileTrackInfo.cs \
 	Banshee.Collection/IBasicTrackInfo.cs \
 	Banshee.Collection/ITrackInfo.cs \

Modified: trunk/banshee/src/Core/Banshee.Core/Resources/translators.xml
==============================================================================
--- trunk/banshee/src/Core/Banshee.Core/Resources/translators.xml	(original)
+++ trunk/banshee/src/Core/Banshee.Core/Resources/translators.xml	Sun May 25 19:48:34 2008
@@ -49,6 +49,7 @@
   <language code="fr" name="French">
     <person>Jonathan Ernst</person>
     <person>StÃphane Raimbault</person>
+    <person>Claude Paroz</person>
     <person>Florent Le Coz</person>
     <person>Robert-Andrà Mauchin</person>
   </language>

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumInfo.cs	Sun May 25 19:48:34 2008
@@ -31,6 +31,7 @@
 
 using Mono.Unix;
 
+using Hyena.Data;
 using Hyena.Data.Sqlite;
 
 using Banshee.Database;
@@ -38,7 +39,7 @@
 
 namespace Banshee.Collection.Database
 {
-    public class DatabaseAlbumInfo : AlbumInfo, ICacheableItem
+    public class DatabaseAlbumInfo : AlbumInfo
     {
         private static BansheeModelProvider<DatabaseAlbumInfo> provider = new BansheeModelProvider<DatabaseAlbumInfo> (
             ServiceManager.DbConnection, "CoreAlbums"
@@ -127,18 +128,6 @@
             get { return dbid; }
         }
 
-        private long cache_entry_id;
-        public long CacheEntryId {
-            get { return cache_entry_id; }
-            set { cache_entry_id = value; }
-        }
-
-        private long cache_model_id;
-        public long CacheModelId {
-            get { return cache_model_id; }
-            set { cache_model_id = value; }
-        }
-
         [DatabaseColumn("ArtistID")]
         private int artist_id;
         public int ArtistId {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs	Sun May 25 19:48:34 2008
@@ -39,7 +39,7 @@
 
 namespace Banshee.Collection.Database
 {
-    public class DatabaseAlbumListModel : DatabaseBrowsableListModel<DatabaseAlbumInfo, AlbumInfo>
+    public class DatabaseAlbumListModel : DatabaseFilterListModel<DatabaseAlbumInfo, AlbumInfo>
     {
         public DatabaseAlbumListModel ( Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
             : base (source, trackModel, connection, DatabaseAlbumInfo.Provider, new AlbumInfo (null), uuid)
@@ -58,7 +58,7 @@
             get { return "CoreTracks.AlbumID"; }
         }
         
-        public override string ItemToFilterValue (object item)
+        protected override string ItemToFilterValue (object item)
         {
             return (item is DatabaseAlbumInfo) ? (item as DatabaseAlbumInfo).DbId.ToString () : null;
         }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistInfo.cs	Sun May 25 19:48:34 2008
@@ -31,6 +31,7 @@
 
 using Mono.Unix;
 
+using Hyena.Data;
 using Hyena.Data.Sqlite;
 
 using Banshee.Database;
@@ -38,7 +39,7 @@
 
 namespace Banshee.Collection.Database
 {
-    public class DatabaseArtistInfo : ArtistInfo, ICacheableItem
+    public class DatabaseArtistInfo : ArtistInfo
     {
         private static BansheeModelProvider<DatabaseArtistInfo> provider = new BansheeModelProvider<DatabaseArtistInfo> (
             ServiceManager.DbConnection, "CoreArtists"
@@ -119,18 +120,6 @@
             get { return dbid; }
         }
 
-        private long cache_entry_id;
-        public long CacheEntryId {
-            get { return cache_entry_id; }
-            set { cache_entry_id = value; }
-        }
-
-        private long cache_model_id;
-        public long CacheModelId {
-            get { return cache_model_id; }
-            set { cache_model_id = value; }
-        }
-
         [DatabaseColumn]
         public override string Name {
             get { return base.Name; }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseArtistListModel.cs	Sun May 25 19:48:34 2008
@@ -38,7 +38,7 @@
 
 namespace Banshee.Collection.Database
 {
-    public class DatabaseArtistListModel : DatabaseBrowsableListModel<DatabaseArtistInfo, ArtistInfo>
+    public class DatabaseArtistListModel : DatabaseFilterListModel<DatabaseArtistInfo, ArtistInfo>
     {
         public DatabaseArtistListModel ( Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
             : base (source, trackModel, connection, DatabaseArtistInfo.Provider, new ArtistInfo (null), uuid)
@@ -56,7 +56,7 @@
             get { return "CoreArtists.ArtistID"; }
         }
         
-        public override string ItemToFilterValue (object item)
+        protected override string ItemToFilterValue (object item)
         {
             return (item is DatabaseArtistInfo) ? (item as DatabaseArtistInfo).DbId.ToString () : null;
         }

Copied: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs (from r3969, /trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseBrowsableListModel.cs)
==============================================================================
--- /trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseBrowsableListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseFilterListModel.cs	Sun May 25 19:48:34 2008
@@ -33,28 +33,18 @@
 using System.Collections.Generic;
 
 using Hyena;
+using Hyena.Data;
 using Hyena.Data.Sqlite;
 
 using Banshee.Collection;
 using Banshee.Database;
 
 namespace Banshee.Collection.Database
-{
-    public interface IFilterListModel : Hyena.Data.IListModel
-    {
-        string FilterColumn { get; }
-        string ItemToFilterValue (object item);
-        void RaiseReloaded ();
-        void Reload (bool notify);
-
-        IEnumerable<object> GetSelectedObjects ();
-    }
-    
-    public abstract class DatabaseBrowsableListModel<T, U> : BrowsableListModel<U>, IFilterListModel, ICacheableDatabaseModel
-        where T : ICacheableItem, U, new()
+{   
+    public abstract class DatabaseFilterListModel<T, U> : FilterListModel<U>, ICacheableDatabaseModel
+        where T : U, new () where U : ICacheableItem, new()
     {
         private readonly BansheeModelCache<T> cache;
-        private readonly DatabaseTrackListModel browsing_model;
         private readonly Banshee.Sources.DatabaseSource source;
         
         private long count;
@@ -68,53 +58,30 @@
         
         protected readonly U select_all_item;
 
-        public DatabaseBrowsableListModel ( Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, SqliteModelProvider<T> provider, U selectAllItem, string uuid)
-            : base ()
+        public DatabaseFilterListModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, SqliteModelProvider<T> provider, U selectAllItem, string uuid)
+            : base (trackModel)
         {
             this.source = source;
-            browsing_model = trackModel;
             select_all_item = selectAllItem;
             
             cache = new BansheeModelCache <T> (connection, uuid, this, provider);
             cache.HasSelectAllItem = true;
-
-            Selection.Changed += HandleSelectionChanged;
         }
         
-#region IFilterModel<T> Implementation
-
-        public abstract string FilterColumn { get; }
-        public abstract string ItemToFilterValue (object item);
-
-#endregion
-
-        public IEnumerable<object> GetSelectedObjects ()
-        {
-            foreach (object o in SelectedItems) {
-                yield return o;
-            }
-        }
-
-        private void HandleSelectionChanged (object sender, EventArgs args)
+        public override void Clear ()
         {
-            browsing_model.Reload (this);
-        }
-
-        public override void Reload ()
-        {
-            Reload (false);
         }
         
         protected virtual void GenerateReloadFragment ()
         {
             ReloadFragment = String.Format (
                 ReloadFragmentFormat,
-                browsing_model.CachesJoinTableEntries ? browsing_model.JoinFragment : null,
-                browsing_model.CacheId,
-                browsing_model.CachesJoinTableEntries
+                FilteredModel.CachesJoinTableEntries ? FilteredModel.JoinFragment : null,
+                FilteredModel.CacheId,
+                FilteredModel.CachesJoinTableEntries
                     ? String.Format (
                         "{0}.{1} AND CoreTracks.TrackID = {0}.{2}",
-                        browsing_model.JoinTable, browsing_model.JoinPrimaryKey, browsing_model.JoinColumn
+                        FilteredModel.JoinTable, FilteredModel.JoinPrimaryKey, FilteredModel.JoinColumn
                     ) : "CoreTracks.TrackID",
                 GetFilterFragment ()
             );
@@ -124,9 +91,9 @@
         {
             StringBuilder qb = new StringBuilder ();
             foreach (IFilterListModel model in UpstreamFilters) {
-                string filter = GetFilterFromModel (model);
+                string filter = model.GetSqlFilter ();
                 if (filter != null) {
-                    qb.Append ("AND");
+                    qb.Append (" AND ");
                     qb.Append (filter);
                 }
             }
@@ -144,14 +111,21 @@
                 }
             }
         }
+        
+        protected abstract string ItemToFilterValue (object o);
 
         // Ick, duplicated from DatabaseTrackListModel
-        private string GetFilterFromModel (IFilterListModel model)
+        public override string GetSqlFilter ()
         {
             string filter = null;
             
-            ModelHelper.BuildIdFilter<object> (model.GetSelectedObjects (), model.FilterColumn, null,
-                delegate (object item) { return model.ItemToFilterValue (item); },
+            ModelHelper.BuildIdFilter<object> (GetSelectedObjects (), FilterColumn, null,
+                delegate (object item) {
+                    if (item != select_all_item) {
+                        return ItemToFilterValue (item);
+                    }
+                    return null;
+                },
                 delegate (string new_filter) { filter = new_filter; }
             );
             
@@ -160,7 +134,7 @@
         
         public abstract void UpdateSelectAllItem (long count);
 
-        public void Reload (bool notify)
+        public override void Reload (bool notify)
         {
             GenerateReloadFragment ();
 
@@ -185,7 +159,7 @@
                 return cache.GetValue (index - 1);
             }
         }
-        
+
         public override int Count { 
             get { return (int) count; }
         }
@@ -205,12 +179,21 @@
         public int CacheId {
             get { return (int) cache.CacheId; }
         }
+        
+        public IEnumerable<object> GetSelectedObjects ()
+        {
+            foreach (object o in SelectedItems) {
+                yield return o;
+            }
+        }
 
         public void InvalidateCache ()
         {
             cache.ClearManagedCache ();
             OnReloaded ();
         }
+        
+        public abstract string FilterColumn { get; }
 
         public virtual string JoinTable { get { return null; } }
         public virtual string JoinFragment { get { return null; } }

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	Sun May 25 19:48:34 2008
@@ -31,6 +31,7 @@
 using System.IO;
 
 using Hyena;
+using Hyena.Data;
 using Hyena.Data.Sqlite;
 using Hyena.Query;
 
@@ -58,7 +59,7 @@
         AbsoluteUri = 2
     }
 
-    public class DatabaseTrackInfo : TrackInfo, ICacheableItem
+    public class DatabaseTrackInfo : TrackInfo
     {
         private static DatabaseTrackModelProvider<DatabaseTrackInfo> provider = new DatabaseTrackModelProvider<DatabaseTrackInfo> (
             ServiceManager.DbConnection
@@ -451,22 +452,6 @@
             }
         }
 
-#region Implement ICacheableItem
-
-        private long cache_entry_id;
-        public long CacheEntryId {
-            get { return cache_entry_id; }
-            set { cache_entry_id = value; }
-        }
-
-        private long cache_model_id;
-        public long CacheModelId {
-            get { return cache_model_id; }
-            set { cache_model_id = value; }
-        }
-
-#endregion
-
         private void UpdateUri ()
         {
             if (Uri == null && uri_type_set && UriField != null && PrimarySource != null) {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs	Sun May 25 19:48:34 2008
@@ -174,7 +174,9 @@
             get {
                 return unfiltered_query ?? unfiltered_query = String.Format (
                     "FROM {0}{1} WHERE {2} {3}",
-                    provider.From, JoinFragment, provider.Where, ConditionFragment
+                    provider.From, JoinFragment,
+                    String.IsNullOrEmpty (provider.Where) ? "1=1" : provider.Where,
+                    ConditionFragment
                 );
             }
         }
@@ -269,16 +271,16 @@
             
             if (with_filters) {
                 foreach (IFilterListModel model in source.FilterModels) {
-                    string filter = GetFilterFromModel (model);
+                    string filter = model.GetSqlFilter ();
                     if (filter != null) {
-                        qb.Append ("AND");
+                        qb.Append (" AND ");
                         qb.Append (filter);
                     }
                 }
             }
             
             if (query_fragment != null) {
-                qb.Append ("AND ");
+                qb.Append (" AND ");
                 qb.Append (query_fragment);
             }
             
@@ -294,7 +296,7 @@
         public override int IndexOf (TrackInfo track)
         {
             DatabaseTrackInfo db_track = track as DatabaseTrackInfo;
-            return (int) (db_track == null ? -1 : cache.IndexOf ((int)db_track.TrackId));
+            return (int) (db_track == null ? -1 : cache.IndexOf ((int)db_track.CacheEntryId));
         }
 
         private DateTime random_began_at = DateTime.MinValue;
@@ -402,22 +404,9 @@
         private string PrefixCondition (string prefix)
         {
             string condition = Condition;
-            if (condition == null || condition == String.Empty)
-                return String.Empty;
-            else
-                return String.Format (" {0} {1} ", prefix, condition);
-        }
-        
-        private string GetFilterFromModel (IFilterListModel model)
-        {
-            string filter = null;
-            
-            ModelHelper.BuildIdFilter<object> (model.GetSelectedObjects (), model.FilterColumn, null,
-                delegate (object item) { return model.ItemToFilterValue (item); },
-                delegate (string new_filter) { filter = new_filter; }
-            );
-            
-            return filter;
+            return String.IsNullOrEmpty (condition)
+                ? String.Empty
+                : String.Format (" {0} {1} ", prefix, condition);
         }
 
         /*public override IEnumerable<ArtistInfo> ArtistInfoFilter {

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/AlbumListModel.cs	Sun May 25 19:48:34 2008
@@ -47,6 +47,10 @@
             selection = new SelectAllSelection ();
             selection.SelectAll ();
         }
+        
+        public override void Clear ()
+        {
+        }
 
         public virtual IEnumerable<ArtistInfo> ArtistInfoFilter {
             set { throw new NotImplementedException(); }

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	Sun May 25 19:48:34 2008
@@ -75,23 +75,23 @@
             OnReloaded ();
         }
         
-        public virtual void Clear()
-        {
+        public abstract void Clear();
+        /*{
             throw new NotImplementedException();
-        }
+        }*/
         
-        public virtual void Reload()
-        {
+        public abstract void Reload();
+        /*{
             throw new NotImplementedException();
-        }
+        }*/
     
-        public virtual T this[int index] {
-            get { throw new NotImplementedException(); }
-        }
+        public abstract T this[int index] { get; }
+            /*get { throw new NotImplementedException(); }
+        }*/
 
-        public virtual int Count { 
-            get { throw new NotImplementedException(); }
-        }
+        public abstract int Count { get; }
+            /*get { throw new NotImplementedException(); }
+        }*/
 
         public virtual Selection Selection {
             get { return selection; }

Copied: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs (from r3969, /trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BrowsableListModel.cs)
==============================================================================
--- /trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/BrowsableListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/FilterListModel.cs	Sun May 25 19:48:34 2008
@@ -32,22 +32,68 @@
 using Hyena.Data;
 using Banshee.ServiceStack;
 
+// TODO remove this
+using Banshee.Collection.Database;
+
 namespace Banshee.Collection
 {
-    public abstract class BrowsableListModel<T> : BansheeListModel<T>
+    public abstract class FilterListModel<T> : BansheeListModel<T>, IFilterListModel
     {
-        public BrowsableListModel () : base ()
+        // TODO refactor/pull out interface so this isn't track specific
+        private readonly DatabaseTrackListModel browsing_model;
+        protected DatabaseTrackListModel FilteredModel {
+            get { return browsing_model; }
+        }
+
+        public FilterListModel (DatabaseTrackListModel trackModel) : base ()
         {
+            browsing_model = trackModel;
+            
             selection = new SelectAllSelection ();
             selection.SelectAll ();
+            
+            Selection.Changed += HandleSelectionChanged;
         }
         
-        public BrowsableListModel (IDBusExportable parent) : base (parent)
+        public FilterListModel (IDBusExportable parent) : base (parent)
         {
             selection = new SelectAllSelection ();
             selection.SelectAll ();
         }
         
+        public override void Reload ()
+        {
+            Reload (false);
+        }
+        
+        public abstract void Reload (bool notify);
+        
+        /*protected virtual void GenerateReloadFragment ()
+        {
+            ReloadFragment = String.Format (
+                ReloadFragmentFormat,
+                browsing_model.CachesJoinTableEntries ? browsing_model.JoinFragment : null,
+                browsing_model.CacheId,
+                browsing_model.CachesJoinTableEntries
+                    ? String.Format (
+                        "{0}.{1} AND CoreTracks.TrackID = {0}.{2}",
+                        browsing_model.JoinTable, browsing_model.JoinPrimaryKey, browsing_model.JoinColumn
+                    ) : "CoreTracks.TrackID",
+                GetFilterFragment ()
+            );
+        }*/
+        
+        private void HandleSelectionChanged (object sender, EventArgs args)
+        {
+            browsing_model.Reload (this);
+        }
+        
+#region IFilterModel Implementation
+
+        public abstract string GetSqlFilter ();
+
+#endregion
+        
         //public abstract void RaiseReloaded ();
     }
 }

Added: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/IFilterListModel.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection/IFilterListModel.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,40 @@
+//
+// IFilterListModel.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+
+namespace Banshee.Collection.Database
+{
+    public interface IFilterListModel : Hyena.Data.IListModel
+    {
+        string GetSqlFilter ();
+        void RaiseReloaded ();
+        void Reload (bool notify);
+    }
+}
\ No newline at end of file

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Database/BansheeModelCache.cs	Sun May 25 19:48:34 2008
@@ -30,6 +30,7 @@
 using System;
 using System.Data;
 
+using Hyena.Data;
 using Hyena.Data.Sqlite;
 
 namespace Banshee.Database

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	Sun May 25 19:48:34 2008
@@ -38,6 +38,19 @@
 
 namespace Banshee.Query
 {
+    /*public interface IQueryDefines
+    {
+        QueryOrder [] Orders { get; }
+        QueryLimit [] Limits { get; }
+        QueryFieldSet FieldSet { get; }
+        string GetSqlSort (string key, bool asc);
+    }
+    
+    public class QueryDefines : IQueryDefines
+    {
+        
+    }*/
+    
     public static class BansheeQuery
     {
         private static bool asc = true;
@@ -72,6 +85,8 @@
             new QueryLimit ("MB",      Catalog.GetString ("MB"), "CoreTracks.FileSize", (int) FileSizeFactor.MB),
             new QueryLimit ("GB",      Catalog.GetString ("GB"), "CoreTracks.FileSize", (int) FileSizeFactor.GB)
         };
+        
+#region QueryField Definitions
 
         public static QueryField ArtistField = new QueryField (
             "artist", Catalog.GetString ("Artist"), "CoreArtists.NameLowered", true,
@@ -201,6 +216,8 @@
             "CoreTracks.TrackID {2} IN (SELECT TrackID FROM CoreSmartPlaylistEntries WHERE SmartPlaylistID = {1})", typeof(SmartPlaylistQueryValue),
             "smartplaylistid", "smartplaylist"
         );
+        
+#endregion
 
         public static QueryFieldSet FieldSet = new QueryFieldSet (
             ArtistField, AlbumField, DiscField, TitleField, YearField, GenreField, ComposerField, RatingField, PlayCountField,
@@ -208,8 +225,7 @@
             DateAddedField, PlaylistField, SmartPlaylistField
         );
 
-        private const string default_sort = "CoreArtists.NameLowered ASC, CoreAlbums.TitleLowered ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC, CoreTracks.Uri ASC";
-
+        private const string default_sort = @"CoreArtists.NameLowered ASC, CoreAlbums.TitleLowered ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC, CoreTracks.Uri ASC";
         public static string GetSort (string key)
         {
             return GetSort (key, false);

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Services.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Services" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Services" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Banshee.Services" />
@@ -165,9 +165,10 @@
     <File name="Banshee.ServiceStack/IDelayedInitializeService.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Sources/DurationStatusFormatters.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.SmartPlaylist/SmartPlaylistDefinition.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Collection.Database/DatabaseBrowsableListModel.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Collection/BrowsableListModel.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection.Database/DatabaseFilterListModel.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection/FilterListModel.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Playlists.Formats/Tests/PlaylistFormatTests.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection/IFilterListModel.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

Modified: trunk/banshee/src/Core/Banshee.Services/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Makefile.am	Sun May 25 19:48:34 2008
@@ -10,7 +10,7 @@
 	Banshee.Collection.Database/DatabaseAlbumListModel.cs \
 	Banshee.Collection.Database/DatabaseArtistInfo.cs \
 	Banshee.Collection.Database/DatabaseArtistListModel.cs \
-	Banshee.Collection.Database/DatabaseBrowsableListModel.cs \
+	Banshee.Collection.Database/DatabaseFilterListModel.cs \
 	Banshee.Collection.Database/DatabaseImportManager.cs \
 	Banshee.Collection.Database/DatabaseTrackInfo.cs \
 	Banshee.Collection.Database/DatabaseTrackListModel.cs \
@@ -21,9 +21,10 @@
 	Banshee.Collection/AlbumListModel.cs \
 	Banshee.Collection/ArtistListModel.cs \
 	Banshee.Collection/BansheeListModel.cs \
-	Banshee.Collection/BrowsableListModel.cs \
 	Banshee.Collection/ExportableModel.cs \
+	Banshee.Collection/FilterListModel.cs \
 	Banshee.Collection/IExportableModel.cs \
+	Banshee.Collection/IFilterListModel.cs \
 	Banshee.Collection/ImportEventHandler.cs \
 	Banshee.Collection/ImportManager.cs \
 	Banshee.Collection/MemoryTrackListModel.cs \

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentPaneController.cs	Sun May 25 19:48:34 2008
@@ -43,10 +43,11 @@
         private uint timer_id = 0;
         private bool pending_changes;
         private Paned pane;
+        private int last_position;
         
         public static void Control (Paned pane, string name)
         {
-            Control (pane, "interface.panes." + name, "position", pane.Position); 
+            Control (pane, String.Format ("interface.panes.{0}", name), "position", pane.Position); 
         }
         
         public static void Control (Paned pane, SchemaEntry<int> entry)
@@ -74,12 +75,27 @@
         
         private Paned Paned {
             set {
+                if (pane == value) {
+                    return;
+                }
+                
+                if (pane != null) {
+                    //pane.MoveHandle -= OnPaneMoved;
+                }
+                
                 pane = value;
                 pane.Position = ConfigurationClient.Get<int> (@namespace, key, fallback);
-                pane.SizeAllocated += delegate { Save (); };
+                //pane.MoveHandle += OnPaneMoved;
+                //pane.AcceptPosition += delegate { Console.WriteLine ("accept pos called, pos = {0}", pane.Position); };
+                pane.SizeAllocated += OnPaneMoved;
             }
         }
         
+        private void OnPaneMoved (object sender, EventArgs args)
+        {
+            Save ();
+        }
+        
         private void Save ()
         {
             if (timer_id == 0) {
@@ -95,10 +111,13 @@
                 pending_changes = false;
                 return true;
             } else {
-                ConfigurationClient.Set<int> (@namespace, key, pane.Position);
+                if (pane.Position != last_position) {
+                    ConfigurationClient.Set<int> (@namespace, key, pane.Position);
+                    last_position = pane.Position;
+                }
                 timer_id = 0;
                 return false;
             }
         }
     }
-}
+}
\ No newline at end of file

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/CompositeTrackSourceContents.cs	Sun May 25 19:48:34 2008
@@ -53,10 +53,10 @@
         private AlbumListView album_view;
         private TrackListView track_view;
 
-        public CompositeTrackSourceContents () : base ()
+        public CompositeTrackSourceContents () : base ("albumartist")
         {
         }
-        
+
         protected override void InitializeViews ()
         {
             SetupMainView (track_view = new TrackListView ());
@@ -131,6 +131,7 @@
 
         public override bool SetSource (ISource source)
         {
+            //Console.WriteLine ("CTSC.set_source 1");
             ITrackModelSource track_source = source as ITrackModelSource;
             if (track_source == null) {
                 return false;
@@ -150,16 +151,19 @@
             }
             
             track_view.HeaderVisible = true;
+            //Console.WriteLine ("CTSC.set_source 2");
             return true;
         }
 
         public override void ResetSource ()
         {
+            //Console.WriteLine ("CTSC.reset_source 1");
             source = null;
             track_view.SetModel (null);
             artist_view.SetModel (null);
             album_view.SetModel (null);
             track_view.HeaderVisible = false;
+            //Console.WriteLine ("CTSC.reset_source 2");
         }
 
 #endregion

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Sources.Gui/FilteredListSourceContents.cs	Sun May 25 19:48:34 2008
@@ -52,6 +52,7 @@
 {
     public abstract class FilteredListSourceContents : VBox, ISourceContents
     {
+        private string name;
         private object main_view;
         private Gtk.ScrolledWindow main_scrolled_window;
         
@@ -59,6 +60,7 @@
         private List<ScrolledWindow> filter_scrolled_windows = new List<ScrolledWindow> ();
         
         private Dictionary<object, double> model_positions = new Dictionary<object, double> ();
+        private Dictionary<ScrolledWindow, bool> resizable_views = new Dictionary<ScrolledWindow, bool> ();
         
         private Paned container;
         private Widget browser_container;
@@ -81,8 +83,9 @@
             </ui>
         ";
 
-        public FilteredListSourceContents ()
+        public FilteredListSourceContents (string name)
         {
+            this.name = name;
             InitializeViews ();
         
             string position = BrowserPosition.Get ();
@@ -141,7 +144,9 @@
         
         protected void SetupFilterView<T> (ListView<T> filter_view)
         {
-            filter_scrolled_windows.Add (SetupView (filter_view));
+            ScrolledWindow window = SetupView (filter_view);
+            resizable_views[window] = filter_view.IsResizable;
+            filter_scrolled_windows.Add (window);
             filter_view.HeaderVisible = false;
             filter_view.SelectionProxy.Changed += OnBrowserViewSelectionChanged;
         }
@@ -165,79 +170,103 @@
         
         private void Reset ()
         {
-            //Hyena.Log.Information ("ListBrowser Reset");
             // Unparent the views' scrolled window parents so they can be re-packed in 
             // a new layout. The main container gets destroyed since it will be recreated.
             
-            if (filter_scrolled_windows.Count > 0) {
-                Container filter_container = filter_scrolled_windows[0].Parent as Container;
+            //Console.WriteLine ("FLSC.reset 1");
+            foreach (ScrolledWindow window in filter_scrolled_windows) {
+                Paned filter_container = window.Parent as Paned;
                 if (filter_container != null) {
-                    foreach (ScrolledWindow window in filter_scrolled_windows) {
-                        filter_container.Remove (window);
-                    }
-                } //else
-                    //Hyena.Log.Information ("No filter container");
-            } //else
-                //Hyena.Log.Information ("No filter windows");
+                    filter_container.Remove (window);
+                }
+            }
+            //Console.WriteLine ("FLSC.reset 2");
             
             if (container != null && main_scrolled_window != null) {
                 container.Remove (main_scrolled_window);
-            } //else
-                //Hyena.Log.Information ("No main container");
+            }
+            
+            //Console.WriteLine ("FLSC.reset 3");
             
             if (container != null) {
                 Remove (container);
-                container.Destroy ();
             }
+            //Console.WriteLine ("FLSC.reset 4");
         }
 
         private void LayoutLeft ()
         {
-            //Hyena.Log.Information ("ListBrowser LayoutLeft");
-            Reset ();
-            
-            container = new HPaned ();
-            VBox filter_box = new VBox ();
-            filter_box.Spacing = 10;
-            
-            foreach (ScrolledWindow window in filter_scrolled_windows) {
-                filter_box.PackStart (window, true, true, 0);
-            }
-            
-            //filter_box.Position = 350;
-            //PersistentPaneController.Control (filter_box, "browser.left.artist_album_box");
-            
-            container.Add1 (filter_box);
-            container.Add2 (main_scrolled_window);
-            
-            browser_container = filter_box;
-            
-            container.Position = 275;
-            PersistentPaneController.Control (container, "browser.left");
-            ShowPack ();
+            Layout (false);
         }
         
         private void LayoutTop ()
         {
-            //Hyena.Log.Information ("ListBrowser LayoutTop");
+            Layout (true);
+        }
+
+        private void Layout (bool top)
+        {
+            //Hyena.Log.Information ("ListBrowser LayoutLeft");
             Reset ();
             
-            container = new VPaned ();
-            HBox filter_box = new HBox ();
-            filter_box.Spacing = 10;
-            
-            foreach (ScrolledWindow window in filter_scrolled_windows) {
-                filter_box.PackStart (window, true, true, 0);
+            container = GetPane (!top);
+            Paned filter_box = GetPane (top);
+            filter_box.PositionSet = true;
+            Paned current_pane = filter_box;
+            //Console.WriteLine ("FLSC.layout 1");
+            
+            for (int i = 0; i < filter_scrolled_windows.Count; i++) {
+                ScrolledWindow window = filter_scrolled_windows[i];
+                bool last_even_filter = (i == filter_scrolled_windows.Count - 1 && filter_scrolled_windows.Count % 2 == 0);
+                if (i > 0 && !last_even_filter) {
+                    //Console.WriteLine ("creating new pane for filter {0}", i);
+                    Paned new_pane = GetPane (top);
+                    current_pane.Add2 (new_pane);
+                    current_pane.Position = 350;
+                    PersistentPaneController.Control (current_pane, ControllerName (top, i));
+                    current_pane = new_pane;
+                }
+               
+                if (last_even_filter) {
+                    current_pane.Add2 (window);
+                    current_pane.Position = 350;
+                    PersistentPaneController.Control (current_pane, ControllerName (top, i));
+                } else {
+                    /*if (i == 0)
+                        current_pane.Pack1 (window, false, false);
+                    else*/
+                        current_pane.Add1 (window);
+                }
+                    
+                //Console.WriteLine ("FLSC.layout 2");
             }
             
+            //Console.WriteLine ("FLSC.layout 3");
             container.Add1 (filter_box);
             container.Add2 (main_scrolled_window);
-            
+            //Console.WriteLine ("FLSC.layout 4");
             browser_container = filter_box;
             
-            container.Position = 175;
-            PersistentPaneController.Control (container, "browser.top");
+            container.Position = top ? 175 : 275;
+            PersistentPaneController.Control (container, ControllerName (top, -1));
             ShowPack ();
+            //Console.WriteLine ("FLSC.layout 5");
+        }
+        
+        private string ControllerName (bool top, int filter)
+        {
+            if (filter == -1)
+                return String.Format ("{0}.browser.{1}", name, top ? "top" : "left");
+            else
+                return String.Format ("{0}.browser.{1}.{2}", name, top ? "top" : "left", filter);
+        }
+        
+        private Paned GetPane (bool hpane)
+        {
+            if (hpane)
+                return new HPaned ();
+            else
+                return new VPaned ();
         }
         
         private void ShowPack ()
@@ -283,6 +312,7 @@
                 foreach (IListView view in filter_views) {
                     if (view.Selection == selection) {
                         view.ScrollTo (0);
+                        break;
                     }
                 }
             }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.ThickClient" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.ThickClient" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Banshee.ThickClient" />

Modified: trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.Widgets/Banshee.Widgets.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Widgets" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Widgets" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Banshee.Widgets" />

Modified: trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.AudioCd/Banshee.AudioCd.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.AudioCd" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.AudioCd" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.AudioCd" />

Modified: trunk/banshee/src/Extensions/Banshee.BooScript/Banshee.BooScript.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.BooScript/Banshee.BooScript.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.BooScript/Banshee.BooScript.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.BooScript" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.BooScript" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.BooScript" />

Modified: trunk/banshee/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.Bookmarks/Banshee.Bookmarks.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Bookmarks" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Bookmarks" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Bookmarks" />

Modified: trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.Daap/Banshee.Daap.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Daap" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Daap" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Daap" />

Modified: trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Plugins.Lastfm" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Plugins.Lastfm" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="." assembly="Banshee.Plugins.LastFM" />

Modified: trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.MultimediaKeys/Banshee.MultimediaKeys.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.MultimediaKeys" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.MultimediaKeys" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.MultimediaKeys" />

Modified: trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.NotificationArea/Banshee.NotificationArea.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.NotificationArea" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.NotificationArea" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.NotificationArea" />

Modified: trunk/banshee/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.NowPlaying" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.NowPlaying" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.NowPlaying" />

Modified: trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.PlayQueue" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.PlayQueue" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.PlayQueue" />

Copied: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs (from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastFeedModel.cs)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastFeedModel.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastFeedModel.cs	Sun May 25 19:48:34 2008
@@ -40,7 +40,7 @@
 
 namespace Banshee.Podcasting.Gui
 {
-    public class PodcastFeedModel : DatabaseBrowsableListModel<Feed, Feed>
+    public class PodcastFeedModel : DatabaseFilterListModel<Feed, Feed>
     {
         public PodcastFeedModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
             : base (source, trackModel, connection, Feed.Provider, new Feed (null, FeedAutoDownload.None), uuid)
@@ -58,7 +58,7 @@
             get { return Feed.Provider.PrimaryKey; }
         }
         
-        public override string ItemToFilterValue (object item)
+        protected override string ItemToFilterValue (object item)
         {
             return (item != select_all_item && item is Feed) ? (item as Feed).DbId.ToString () : null;
         }

Copied: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs (from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSource.cs)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSource.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs	Sun May 25 19:48:34 2008
@@ -53,57 +53,10 @@
 using Migo.Syndication;
 
 namespace Banshee.Podcasting.Gui
-{
-    public class PodcastListModel : DatabaseTrackListModel, IListModel<PodcastTrackInfo>
-    {
-        public PodcastListModel (BansheeDbConnection conn, IDatabaseTrackModelProvider provider, DatabaseSource source) : base (conn, provider, source)
-        {
-            JoinTable = String.Format ("{0}, {1}, {2}", Feed.Provider.TableName, FeedItem.Provider.TableName, FeedEnclosure.Provider.TableName);
-            JoinPrimaryKey = FeedItem.Provider.PrimaryKey;
-            JoinColumn = "ExternalID";
-            AddCondition (String.Format (
-                "{0}.FeedID = {1}.FeedID AND CoreTracks.ExternalID = {1}.ItemID AND {1}.ItemID = {2}.ItemID",
-                Feed.Provider.TableName, FeedItem.Provider.TableName, FeedEnclosure.Provider.TableName
-            ));
-        }
-
-        protected override void GenerateSortQueryPart ()
-        {
-            SortQuery = (SortColumn == null)
-                ? GetSort ("Published", false)
-                : GetSort (SortColumn.SortKey, SortColumn.SortType == Hyena.Data.SortType.Ascending);
-        }
-
-        public static string GetSort (string key, bool asc)
-        {
-            string ascDesc = asc ? "ASC" : "DESC";
-            string sort_query = null;
-            switch(key) {
-                case "PublishedDate":
-                    sort_query = String.Format (@"
-                        PodcastItems.PubDate {0}", ascDesc);
-                    break;
-
-                case "DownloadStatus":
-                    sort_query = String.Format (@"
-                        PodcastEnclosures.DownloadStatus {0}", ascDesc);
-                    break;
-            }
-
-            return sort_query ?? Banshee.Query.BansheeQuery.GetSort (key, asc);
-        }
-        
-        public new PodcastTrackInfo this[int index] {
-            get {
-                lock (this) {
-                    return cache.GetValue (index) as PodcastTrackInfo;
-                }
-            }
-        }
-    }
-    
+{ 
     public class PodcastSource : Banshee.Library.LibrarySource
     {
+        private PodcastUnheardFilterModel unheard_model;
         private PodcastFeedModel feed_model;
 
         private string baseDirectory;
@@ -193,13 +146,15 @@
             DatabaseTrackModelProvider<PodcastTrackInfo> track_provider =
                 new DatabaseTrackModelProvider<PodcastTrackInfo> (ServiceManager.DbConnection);
 
-            DatabaseTrackModel = new PodcastListModel (ServiceManager.DbConnection, track_provider, this);
+            DatabaseTrackModel = new PodcastTrackListModel (ServiceManager.DbConnection, track_provider, this);
 
             TrackCache = new DatabaseTrackModelCache<PodcastTrackInfo> (ServiceManager.DbConnection,
                     UniqueId, track_model, track_provider);
                     
             feed_model = new PodcastFeedModel (this, DatabaseTrackModel, ServiceManager.DbConnection, "PodcastFeeds");
             
+            unheard_model = new PodcastUnheardFilterModel (DatabaseTrackModel);
+            
             AfterInitialized ();
         }
         
@@ -235,6 +190,7 @@
         
         public override System.Collections.Generic.IEnumerable<Banshee.Collection.Database.IFilterListModel> FilterModels {
             get {
+                yield return unheard_model;
                 yield return feed_model;
             }
         }

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs	Sun May 25 19:48:34 2008
@@ -108,6 +108,18 @@
             private set { item_id = value; }
         }
         
+        //[VirtualDatabaseColumn ("Title", Item.Feed.Title, "ItemID", "ExternalID")]
+        
+        // Override these two so they aren't considered DatabaseColumns so we don't
+        // join with CoreArtists/CoreAlbums
+        /*public override string AlbumTitle {
+            get { return Item.Feed.Title; }
+        }
+        
+        public override string ArtistName {
+            get { return Item.Author; }
+        }*/
+        
         public FeedEnclosure Enclosure {
             get { return (Item == null) ? null : Item.Enclosure; }
         }
@@ -161,6 +173,16 @@
             Provider.Delete (this);
         }
         
+        public override void IncrementPlayCount ()
+        {
+            base.IncrementPlayCount ();
+            
+            if (PlayCount > 0 && !Item.IsRead) {
+                Item.IsRead = true;
+                Item.Save ();
+            }
+        }
+        
         public void SyncWithFeedItem ()
         {
             //Console.WriteLine ("Syncing item, enclosure == null? {0}", Item.Enclosure == null);
@@ -179,8 +201,10 @@
             Uri = new Banshee.Base.SafeUri (Item.Enclosure.LocalPath ?? Item.Enclosure.Url);
             
             if (!String.IsNullOrEmpty (Item.Enclosure.LocalPath)) {
-                TagLib.File file = Banshee.Streaming.StreamTagger.ProcessUri (Uri);
-                Banshee.Streaming.StreamTagger.TrackInfoMerge (this, file, true);
+                try {
+                    TagLib.File file = Banshee.Streaming.StreamTagger.ProcessUri (Uri);
+                    Banshee.Streaming.StreamTagger.TrackInfoMerge (this, file, true);
+                } catch {}
             }
         }
         

Added: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,104 @@
+//
+// PodcastTrackListModel.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+
+using Gtk;
+using Gdk;
+
+using Mono.Unix;
+
+using Hyena.Data;
+using Hyena.Data.Gui;
+using Hyena.Data.Sqlite;
+
+using Banshee.Gui;
+using Banshee.Base;
+using Banshee.Database;
+using Banshee.Collection;
+using Banshee.ServiceStack;
+using Banshee.Collection.Database;
+
+using Banshee.Sources;
+using Banshee.Sources.Gui;
+
+using Banshee.Podcasting.Data;
+
+using Migo.Syndication;
+
+namespace Banshee.Podcasting.Gui
+{
+    public class PodcastTrackListModel : DatabaseTrackListModel, IListModel<PodcastTrackInfo>
+    {
+        public PodcastTrackListModel (BansheeDbConnection conn, IDatabaseTrackModelProvider provider, DatabaseSource source) : base (conn, provider, source)
+        {
+            JoinTable = String.Format ("{0}, {1}, {2}", Feed.Provider.TableName, FeedItem.Provider.TableName, FeedEnclosure.Provider.TableName);
+            JoinPrimaryKey = FeedItem.Provider.PrimaryKey;
+            JoinColumn = "ExternalID";
+            AddCondition (String.Format (
+                "{0}.FeedID = {1}.FeedID AND CoreTracks.ExternalID = {1}.ItemID AND {1}.ItemID = {2}.ItemID",
+                Feed.Provider.TableName, FeedItem.Provider.TableName, FeedEnclosure.Provider.TableName
+            ));
+        }
+
+        protected override void GenerateSortQueryPart ()
+        {
+            SortQuery = (SortColumn == null)
+                ? GetSort ("Published", false)
+                : GetSort (SortColumn.SortKey, SortColumn.SortType == Hyena.Data.SortType.Ascending);
+        }
+
+        public static string GetSort (string key, bool asc)
+        {
+            string ascDesc = asc ? "ASC" : "DESC";
+            string sort_query = null;
+            switch(key) {
+                case "PublishedDate":
+                    sort_query = String.Format (@"
+                        PodcastItems.PubDate {0}", ascDesc);
+                    break;
+
+                case "DownloadStatus":
+                    sort_query = String.Format (@"
+                        PodcastEnclosures.DownloadStatus {0}", ascDesc);
+                    break;
+            }
+
+            return sort_query ?? Banshee.Query.BansheeQuery.GetSort (key, asc);
+        }
+        
+        public new PodcastTrackInfo this[int index] {
+            get {
+                lock (this) {
+                    return cache.GetValue (index) as PodcastTrackInfo;
+                }
+            }
+        }
+    }
+}

Added: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,95 @@
+//
+// PodcastUnheardFilterModel.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+
+using Hyena.Data;
+
+using Banshee.Database;
+using Banshee.Collection;
+using Banshee.Collection.Database;
+using Banshee.Podcasting.Data;
+
+using Migo.Syndication;
+
+namespace Banshee.Podcasting.Gui
+{
+    public enum OldNewFilter
+    {
+        Both,
+        New,
+        Old
+    }
+
+    public class PodcastUnheardFilterModel : FilterListModel<OldNewFilter>
+    {
+        public PodcastUnheardFilterModel (DatabaseTrackListModel trackModel) : base (trackModel)
+        {
+            // By default, select only New items
+            Selection.Clear (false);
+            Selection.QuietSelect (1);
+        }
+        
+        public override void Reload (bool notify)
+        {
+            if (notify)
+                OnReloaded ();
+        }
+        
+        public override void Clear ()
+        {
+        }
+        
+        public override OldNewFilter this [int index] {
+            get {
+                switch (index) {
+                    case 1:    return OldNewFilter.New;
+                    case 2:    return OldNewFilter.Old;
+                    case 0:
+                    default:   return OldNewFilter.Both;
+                }
+            }
+        }
+        
+        public override int Count {
+            get { return 3; }
+        }
+
+        public override string GetSqlFilter ()
+        {
+            if (Selection.AllSelected)
+                return null;
+            else if (Selection.Contains (1))
+                return "PodcastItems.IsRead = 0";
+            else
+                return "PodcastItems.IsRead = 1";
+        }
+    }
+}

Added: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellUnheard.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,65 @@
+//
+// ColumnCellUnheard.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using Gtk;
+using Cairo;
+
+using Mono.Unix;
+
+using Hyena.Gui;
+using Hyena.Gui.Theming;
+using Hyena.Data.Gui;
+
+using Migo.Syndication;
+
+using Banshee.Gui;
+using Banshee.ServiceStack;
+using Banshee.Collection.Gui;
+
+namespace Banshee.Podcasting.Gui
+{
+    public class ColumnCellUnheard : ColumnCellText
+    {
+        public ColumnCellUnheard () : base (null, true)
+        {
+        }
+    
+        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;
+            }
+        }
+    }
+}

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastActions.cs	Sun May 25 19:48:34 2008
@@ -115,13 +115,12 @@
                 new ActionEntry (
                     "PodcastItemMarkNewAction", null,
                      Catalog.GetString ("Mark as New"), 
-                     "<control><shift>N", String.Empty,
+                     null, String.Empty,
                      OnPodcastItemMarkNew
                 ),
                 new ActionEntry (
                     "PodcastItemMarkOldAction", null,
-                     Catalog.GetString ("Mark as Old"),
-                     "<control><shift>O", String.Empty,
+                     Catalog.GetString ("Mark as Old"), "y", String.Empty,
                      OnPodcastItemMarkOld
                 ),
                 new ActionEntry (
@@ -439,36 +438,45 @@
 
         private void OnPodcastItemMarkNew (object sender, EventArgs e)
         {
-            MarkPodcastItemSelection (true);
+            MarkPodcastItemSelection (false);
         }
         
         private void OnPodcastItemMarkOld (object sender, EventArgs e)
         {
-            MarkPodcastItemSelection (false); 
+            MarkPodcastItemSelection (true);
         }     
         
-        private void MarkPodcastItemSelection (bool markNew) 
+        private void MarkPodcastItemSelection (bool markRead) 
         {
-                    /*ReadOnlyCollection<PodcastItem> items = itemModel.CopySelectedItems ();
-
-                    if (items != null) {
-                        ServiceManager.DbConnection.BeginTransaction ();
-                        
-                        try {                    
-                            foreach (PodcastItem pi in items) {
-                                if (pi.Track != null && pi.New != markNew) {
-                                    pi.New = markNew;
-                                    pi.Save ();
-                                }
-                            }
-                            
-                            ServiceManager.DbConnection.CommitTransaction ();
-                        } catch {
-                            ServiceManager.DbConnection.RollbackTransaction ();
-                        }                        
-                        
-                        itemModel.Reload ();                        
-                    }*/
+            TrackInfo new_selection_track = source.TrackModel [source.TrackModel.Selection.LastIndex + 1];
+            
+            PodcastService.IgnoreItemChanges = true;
+            
+            bool any = false;
+            foreach (PodcastTrackInfo track in GetSelectedItems ()) {
+                if (track.Item.IsRead != markRead) {
+                    track.Item.IsRead = markRead;
+                    track.Item.Save ();
+                    any = true;
+                }
+            }
+            
+            PodcastService.IgnoreItemChanges = false;
+            
+            if (any) {
+                source.Reload ();
+                
+                // If we just removed all of the selected items from our view, we should select the
+                // item after the last removed item
+                if (source.TrackModel.Selection.Count == 0 && new_selection_track != null) {
+                    int new_i = source.TrackModel.IndexOf (new_selection_track);
+                    if (new_i != -1) {
+                        source.TrackModel.Selection.Clear (false);
+                        source.TrackModel.Selection.FocusedIndex = new_i;
+                        source.TrackModel.Selection.Select (new_i);
+                    }
+                }
+            }
         }
         
         private void OnPodcastItemCancel (object sender, EventArgs e)

Copied: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs (from r3969, /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSourceContents.cs)
==============================================================================
--- /trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSourceContents.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs	Sun May 25 19:48:34 2008
@@ -55,14 +55,16 @@
     {
         private PodcastItemView track_view;
         private PodcastFeedView feed_view;
+        private PodcastUnheardFilterView unheard_view;
         
-        public PodcastSourceContents () : base ()
+        public PodcastSourceContents () : base ("podcast")
         {
         }
 
         protected override void InitializeViews ()
         {
             SetupMainView (track_view = new PodcastItemView ());
+            SetupFilterView (unheard_view = new PodcastUnheardFilterView ());
             SetupFilterView (feed_view = new PodcastFeedView ());
         }
         
@@ -70,6 +72,7 @@
         {
             if (feed_view.Model != null) {
                 feed_view.Selection.Clear ();
+                unheard_view.Selection.Clear ();
             }
         }
 
@@ -87,6 +90,7 @@
 
         public override bool SetSource (ISource source)
         {
+            //Console.WriteLine ("PSC.set_source 1");
             PodcastSource track_source = source as PodcastSource;
             if (track_source == null) {
                 return false;
@@ -97,22 +101,28 @@
             SetModel (track_view, track_source.TrackModel);
             
             foreach (IListModel model in track_source.FilterModels) {
-                if (model is IListModel<Feed>)
+                if (model is PodcastFeedModel)
                     SetModel (feed_view, (model as IListModel<Feed>));
+                else if (model is PodcastUnheardFilterModel)
+                    SetModel (unheard_view, (model as IListModel<OldNewFilter>));
                 else
                     Hyena.Log.DebugFormat ("PodcastContents got non-feed filter model: {0}", model);
             }
             
             track_view.HeaderVisible = true;
+            //Console.WriteLine ("PSC.set_source 2");
             return true;
         }
 
         public override void ResetSource ()
         {
+            //Console.WriteLine ("PSC.reset_source 1");
             source = null;
             track_view.SetModel (null);
+            unheard_view.SetModel (null);
             feed_view.SetModel (null);
             track_view.HeaderVisible = false;
+            //Console.WriteLine ("PSC.reset_source 2");
         }
 
 #endregion        

Added: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastUnheardFilterView.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastUnheardFilterView.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,61 @@
+//
+// PodcastUnheardFilterView.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.ObjectModel;
+
+using Mono.Unix;
+
+using Gtk;
+
+using Hyena.Data;
+using Hyena.Data.Gui;
+using Hyena.Collections;
+
+using Banshee.Gui;
+using Banshee.ServiceStack;
+using Banshee.Collection.Gui;
+
+using Banshee.Podcasting.Data;
+
+using Migo.Syndication;
+
+namespace Banshee.Podcasting.Gui
+{
+    public class PodcastUnheardFilterView : TrackFilterListView<OldNewFilter>
+    {
+        public PodcastUnheardFilterView () : base ()
+        {
+            ColumnCellUnheard renderer = new ColumnCellUnheard ();
+            column_controller.Add (new Column ("Unheard Filter", renderer, 1.0));
+            ColumnController = column_controller;
+            
+            IsResizable = false;
+        }
+    }
+}
\ No newline at end of file

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Podcasting" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Podcasting" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Podcasting" />
@@ -26,12 +26,6 @@
     <File name="Banshee.Podcasting.Gui/PodcastManager/Source/ColumnCells/FeedActivityColumnCell.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Podcasting.Gui/PodcastManager/Source/ColumnCells/ItemActivityColumnCell.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Podcasting.Gui/PodcastManager/Source/ColumnCells/PixbufColumnCell.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastFeedModel.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastItemModel.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastFeedView.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastItemView.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSource.cs" subtype="Code" buildaction="Compile" />
-    <File name="Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSourceContents.cs" subtype="Code" buildaction="Compile" />
     <File name="Resources/Images/podcast-icon-16.png" subtype="Code" buildaction="EmbedAsResource" />
     <File name="Resources/Images/podcast-icon-22.png" subtype="Code" buildaction="EmbedAsResource" />
     <File name="Resources/Images/podcast-icon-48.png" subtype="Code" buildaction="EmbedAsResource" />
@@ -40,6 +34,16 @@
     <File name="Banshee.Podcasting/PodcastImageFetchJob.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Podcasting.Gui/PodcastActions.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Podcasting.Gui/ColumnCellPublished.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Gui/PodcastFeedView.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Gui/PodcastItemView.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Gui/PodcastUnheardFilterView.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Gui/ColumnCellUnheard.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Data/PodcastFeedModel.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Data/PodcastSource.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Gui/PodcastSourceContents.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting.Data/PodcastTrackListModel.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Podcasting/PodcastQuery.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Project" localcopy="True" refto="Banshee.Core" />

Added: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastQuery.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastQuery.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,40 @@
+//
+// PodcastQuery.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+using Hyena.Query;
+
+using Banshee.Query;
+
+namespace Banshee.Podcasting
+{
+    /*public class PodcastQuery
+    {
+    }*/
+}

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting/PodcastService.cs	Sun May 25 19:48:34 2008
@@ -253,8 +253,13 @@
             }
         }
         
+        internal static bool IgnoreItemChanges = false;
+        
         private void OnItemChanged (FeedItem item)
         {
+            if (IgnoreItemChanges)
+                return;
+
             PodcastTrackInfo track = PodcastTrackInfo.GetByItemId (item.DbId);
             if (track != null) {
                 track.SyncWithFeedItem ();

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Makefile.am
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Makefile.am	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Makefile.am	Sun May 25 19:48:34 2008
@@ -4,14 +4,21 @@
 INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
 
 SOURCES =  \
+	Banshee.Podcasting.Data/PodcastFeedModel.cs \
+	Banshee.Podcasting.Data/PodcastSource.cs \
 	Banshee.Podcasting.Data/PodcastTrackInfo.cs \
+	Banshee.Podcasting.Data/PodcastTrackListModel.cs \
+	Banshee.Podcasting.Data/PodcastUnheardFilterModel.cs \
 	Banshee.Podcasting.Gui/ColumnCellPodcast.cs \
 	Banshee.Podcasting.Gui/ColumnCellPublished.cs \
+	Banshee.Podcasting.Gui/ColumnCellUnheard.cs \
 	Banshee.Podcasting.Gui/DownloadManager/DownloadManagerInterface.cs \
 	Banshee.Podcasting.Gui/DownloadManager/DownloadUserJob.cs \
 	Banshee.Podcasting.Gui/Models/FilterableListModel.cs \
 	Banshee.Podcasting.Gui/Models/ListModel.cs \
 	Banshee.Podcasting.Gui/PodcastActions.cs \
+	Banshee.Podcasting.Gui/PodcastFeedView.cs \
+	Banshee.Podcasting.Gui/PodcastItemView.cs \
 	Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastFeedPropertiesDialog.cs \
 	Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastPropertiesDialog.cs \
 	Banshee.Podcasting.Gui/PodcastManager/Dialog/PodcastSubscribeDialog.cs \
@@ -19,14 +26,11 @@
 	Banshee.Podcasting.Gui/PodcastManager/Source/ColumnCells/FeedActivityColumnCell.cs \
 	Banshee.Podcasting.Gui/PodcastManager/Source/ColumnCells/ItemActivityColumnCell.cs \
 	Banshee.Podcasting.Gui/PodcastManager/Source/ColumnCells/PixbufColumnCell.cs \
-	Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastFeedModel.cs \
-	Banshee.Podcasting.Gui/PodcastManager/Source/Models/PodcastItemModel.cs \
-	Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSource.cs \
-	Banshee.Podcasting.Gui/PodcastManager/Source/PodcastSourceContents.cs \
-	Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastFeedView.cs \
-	Banshee.Podcasting.Gui/PodcastManager/Source/Views/PodcastItemView.cs \
+	Banshee.Podcasting.Gui/PodcastSourceContents.cs \
+	Banshee.Podcasting.Gui/PodcastUnheardFilterView.cs \
 	Banshee.Podcasting/PodcastImageFetchJob.cs \
 	Banshee.Podcasting/PodcastImportManager.cs \
+	Banshee.Podcasting/PodcastQuery.cs \
 	Banshee.Podcasting/PodcastService.cs \
 	Banshee.Podcasting/PodcastService_Interface.cs
 

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Resources/ActiveSourceUI.xml	Sun May 25 19:48:34 2008
@@ -6,6 +6,21 @@
     </placeholder>
   </toolbar>
 
+  <menubar name="MainMenu" action="MainMenuAction">
+    <menu name="EditMenu" action="EditMenuAction">
+      <placeholder name="BelowAddToPlaylist">
+        <separator />
+        <menuitem name="PodcastItemDownload" action="PodcastItemDownloadAction" />
+        <menuitem name="PodcastItemDeleteFile" action="PodcastItemDeleteFileAction" />
+        <!--
+        <menuitem name="PodcastItemCancel" action="PodcastItemCancelAction" />-->
+        <menuitem name="PodcastItemMarkOld" action="PodcastItemMarkOldAction" />
+        <menuitem name="PodcastItemMarkNew" action="PodcastItemMarkNewAction" />
+        <separator />
+      </placeholder>
+    </menu>
+  </menubar>
+
   <popup name="TrackContextMenu" action="TrackContextMenuAction">
     <placeholder name="BelowAddToPlaylist">
         <separator />
@@ -13,11 +28,10 @@
         <menuitem name="PodcastItemDownload" action="PodcastItemDownloadAction" />
         <menuitem name="PodcastItemDeleteFile" action="PodcastItemDeleteFileAction" />
         <!--
-        <menuitem name="PodcastItemCancel" action="PodcastItemCancelAction" />
+        <menuitem name="PodcastItemCancel" action="PodcastItemCancelAction" />-->
         <separator />
-        <menuitem name="PodcastItemMarkNew" action="PodcastItemMarkNewAction" />
         <menuitem name="PodcastItemMarkOld" action="PodcastItemMarkOldAction" />
-        -->
+        <menuitem name="PodcastItemMarkNew" action="PodcastItemMarkNewAction" />
     </placeholder>
   </popup>
 </ui>

Modified: trunk/banshee/src/Extensions/Banshee.Sample/Banshee.Sample.mdp
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Sample/Banshee.Sample.mdp	(original)
+++ trunk/banshee/src/Extensions/Banshee.Sample/Banshee.Sample.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Banshee.Sample" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Banshee.Sample" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assemblyKeyFile="." assembly="Banshee.Sample" />

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCell.cs	Sun May 25 19:48:34 2008
@@ -50,6 +50,8 @@
         public void BindListItem (object item)
         {
             if (item == null) {
+                bound_object_parent = null;
+                bound_object = null;
                 return;
             }
             

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Hyena.Gui" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Hyena.Gui" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Hyena.Gui" />

Added: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AccordionPane.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/AccordionPane.cs	Sun May 25 19:48:34 2008
@@ -0,0 +1,93 @@
+//
+// AccordionPane.cs
+//
+// Authors:
+//   Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+
+using Gtk;
+
+namespace Hyena.Widgets
+{
+    public class AccordionPane : Bin
+    {
+        private List<Gtk.Paned> panes = new List<Paned> ();
+        
+        private Box 
+        
+        public AccordionPane () : base ()
+        {
+        }
+    }
+    
+#region Test Module
+
+    [Hyena.Gui.TestModule ("Accordion Pane")]
+    internal class RatingEntryTestModule : Gtk.Window
+    {
+        public RatingEntryTestModule () : base ("Rating Entry")
+        {
+            VBox pbox = new VBox ();
+            Add (pbox);
+            
+            Menu m = new Menu ();
+            MenuBar b = new MenuBar ();
+            MenuItem item = new MenuItem ("Rate Me!");
+            item.Submenu = m;
+            b.Append (item);
+            m.Append (new MenuItem ("Apples"));
+            m.Append (new MenuItem ("Pears"));
+            m.Append (new RatingMenuItem ());
+            m.Append (new ImageMenuItem ("gtk-remove", null));
+            m.ShowAll ();
+            pbox.PackStart (b, false, false, 0);
+            
+            VBox box = new VBox ();
+            box.BorderWidth = 10;
+            box.Spacing = 10;
+            pbox.PackStart (box, true, true, 0);
+            
+            RatingEntry entry1 = new RatingEntry ();
+            box.PackStart (entry1, true, true, 0);
+            
+            RatingEntry entry2 = new RatingEntry ();
+            box.PackStart (entry2, false, false, 0);
+            
+            box.PackStart (new Entry ("Normal GtkEntry"), false, false, 0);
+            
+            RatingEntry entry3 = new RatingEntry ();
+            Pango.FontDescription fd = entry3.PangoContext.FontDescription.Copy ();
+            fd.Size = (int)(fd.Size * Pango.Scale.XXLarge);
+            entry3.ModifyFont (fd);
+            box.PackStart (entry3, true, true, 0);
+            
+            pbox.ShowAll ();
+        }
+    }
+    
+#endregion
+}
\ No newline at end of file

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Collections/Selection.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Collections/Selection.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Collections/Selection.cs	Sun May 25 19:48:34 2008
@@ -189,6 +189,14 @@
             get { return ranges.Ranges; }
         }
         
+        public int FirstIndex {
+            get { return Count > 0 ? ranges[0] : -1; }
+        }
+        
+        public int LastIndex {
+            get { return Count > 0 ? ranges[Count - 1]: -1; }
+        }
+        
 #if NET_2_0
         public IEnumerator<int> GetEnumerator ()
         {

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	Sun May 25 19:48:34 2008
@@ -32,7 +32,7 @@
 
 namespace Hyena.Data.Sqlite
 {
-    public interface ICacheableDatabaseModel : ICacheableModel, ISelectable
+    public interface ICacheableDatabaseModel : ICacheableModel
     {
         string ReloadFragment { get; }
         string SelectAggregates { 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	Sun May 25 19:48:34 2008
@@ -296,6 +296,7 @@
         }
 
         private bool saved_selection = false;
+        private long saved_focus_entry_id = -1;
         public void SaveSelection ()
         {
             if (model.Selection != null && model.Selection.Count > 0 &&
@@ -303,6 +304,10 @@
             {
                 connection.Execute (delete_selection_command);
                 saved_selection = true;
+                
+                if (!has_select_all_item && model.Selection.FocusedIndex != -1) {
+                    saved_focus_entry_id = (int) GetValue (model.Selection.FocusedIndex).CacheEntryId;
+                }
 
                 long start, end;
                 foreach (Hyena.Collections.RangeCollection.Range range in model.Selection.Ranges) {
@@ -344,8 +349,15 @@
 
                 if (has_select_all_item && model.Selection.Count == 0) {
                     model.Selection.QuietSelect (0);
+                } if (saved_focus_entry_id != -1) {
+                    long i = IndexOf (saved_focus_entry_id);
+                    if (i != -1) {
+                        // TODO get rid of int cast
+                        model.Selection.FocusedIndex = (int)i;
+                    }
                 }
                 saved_selection = false;
+                saved_focus_entry_id = -1;
             }
         }
 

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	Sun May 25 19:48:34 2008
@@ -30,7 +30,7 @@
 
 namespace Hyena.Data
 {
-    public abstract class ArrayModelCache<T> : ModelCache<T>
+    public abstract class ArrayModelCache<T> : ModelCache<T> where T : ICacheableItem, new ()
     {
         protected T [] cache;
         protected long offset = -1;

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	Sun May 25 19:48:34 2008
@@ -31,7 +31,7 @@
 
 namespace Hyena.Data
 {
-    public abstract class DictionaryModelCache<T> : ModelCache<T>
+    public abstract class DictionaryModelCache<T> : ModelCache<T> where T : ICacheableItem, new ()
     {
         protected Dictionary<long, T> cache;
 

Copied: trunk/banshee/src/Libraries/Hyena/Hyena.Data/ICacheableItem.cs (from r3978, /trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableItem.cs)
==============================================================================
--- /trunk/banshee/src/Libraries/Hyena/Hyena.Data.Sqlite/ICacheableItem.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/ICacheableItem.cs	Sun May 25 19:48:34 2008
@@ -28,7 +28,7 @@
 
 using Hyena.Data;
 
-namespace Hyena.Data.Sqlite
+namespace Hyena.Data
 {
     public interface ICacheableItem
     {

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Data/ICacheableModel.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Data/ICacheableModel.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Data/ICacheableModel.cs	Sun May 25 19:48:34 2008
@@ -31,8 +31,8 @@
 
 namespace Hyena.Data
 {
-    public interface ICacheableModel
+    public interface ICacheableModel : ISelectable
     {
         int FetchCount { get; }
     }
-}
+}
\ No newline at end of file

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	Sun May 25 19:48:34 2008
@@ -52,4 +52,4 @@
     {
         ColumnDescription [] ColumnDescriptions { get; }
     }
-}
+}
\ No newline at end of file

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	Sun May 25 19:48:34 2008
@@ -31,7 +31,7 @@
 
 namespace Hyena.Data
 {
-    public abstract class ModelCache<T>
+    public abstract class ModelCache<T> where T : ICacheableItem, new ()
     {
         protected ICacheableModel model;
 

Modified: trunk/banshee/src/Libraries/Hyena/Hyena.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.mdp	(original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Hyena" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Hyena" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Hyena" />
@@ -82,7 +82,6 @@
     <File name="Hyena/CryptoUtil.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Query/IntegerKeyedObjectQueryValue.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena/ConsoleCrayon.cs" subtype="Code" buildaction="Compile" />
-    <File name="Hyena.Data.Sqlite/ICacheableItem.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Data/ISelectable.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Query/NullQueryValue.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Query/RelativeTimeSpanQueryValue.cs" subtype="Code" buildaction="Compile" />
@@ -96,6 +95,7 @@
     <File name="Hyena/Tests/CryptoUtilTests.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena/Tests/StringUtilTests.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena/Tests/TestBase.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena.Data/ICacheableItem.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

Modified: trunk/banshee/src/Libraries/Hyena/Makefile.am
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Hyena/Makefile.am	Sun May 25 19:48:34 2008
@@ -18,7 +18,6 @@
 	Hyena.Data.Sqlite/HyenaSqliteCommand.cs \
 	Hyena.Data.Sqlite/HyenaSqliteConnection.cs \
 	Hyena.Data.Sqlite/ICacheableDatabaseModel.cs \
-	Hyena.Data.Sqlite/ICacheableItem.cs \
 	Hyena.Data.Sqlite/SqliteModelCache.cs \
 	Hyena.Data.Sqlite/SqliteModelProvider.cs \
 	Hyena.Data.Sqlite/SqliteUtils.cs \
@@ -28,6 +27,7 @@
 	Hyena.Data/ArrayModelCache.cs \
 	Hyena.Data/ColumnDescription.cs \
 	Hyena.Data/DictionaryModelCache.cs \
+	Hyena.Data/ICacheableItem.cs \
 	Hyena.Data/ICacheableModel.cs \
 	Hyena.Data/ICareAboutView.cs \
 	Hyena.Data/IFilterable.cs \

Modified: trunk/banshee/src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp	(original)
+++ trunk/banshee/src/Libraries/Lastfm.Gui/Lastfm.Gui.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Lastfm.Gui" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Lastfm.Gui" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="." assembly="Lastfm" />

Modified: trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp	(original)
+++ trunk/banshee/src/Libraries/Lastfm/Lastfm.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Lastfm" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Lastfm" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="." assembly="Lastfm" />

Modified: trunk/banshee/src/Libraries/Migo/Migo.Syndication/FeedItem.cs
==============================================================================
--- trunk/banshee/src/Libraries/Migo/Migo.Syndication/FeedItem.cs	(original)
+++ trunk/banshee/src/Libraries/Migo/Migo.Syndication/FeedItem.cs	Sun May 25 19:48:34 2008
@@ -125,16 +125,10 @@
             set { guid = value; }
         }
 
-        [DatabaseColumn]
+        [DatabaseColumn("IsRead", Index = "PodcastItemIsReadIndex")]
         public bool IsRead {
             get { return isRead; }
-            set {
-                isRead = value;
-                /*if (isRead != value) {
-                    isRead = value;
-                    Save ();
-                }*/                                        
-            }
+            set { isRead = value; }
         }
         
         [DatabaseColumn]

Modified: trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoItem.cs
==============================================================================
--- trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoItem.cs	(original)
+++ trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoItem.cs	Sun May 25 19:48:34 2008
@@ -29,6 +29,7 @@
 using System;
 
 using Hyena;
+using Hyena.Data;
 using Hyena.Data.Sqlite;
 
 namespace Migo.Syndication

Modified: trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs
==============================================================================
--- trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs	(original)
+++ trunk/banshee/src/Libraries/Migo/Migo.Syndication/MigoModelProvider.cs	Sun May 25 19:48:34 2008
@@ -30,6 +30,7 @@
 using System.Collections.Generic;
 
 using Hyena;
+using Hyena.Data;
 using Hyena.Data.Sqlite;
 
 namespace Migo.Syndication

Modified: trunk/banshee/src/Libraries/Migo/Migo.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Migo/Migo.mdp	(original)
+++ trunk/banshee/src/Libraries/Migo/Migo.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Migo" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Migo" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Migo" />

Modified: trunk/banshee/src/Libraries/Mono.Media/Mono.Media.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Mono.Media/Mono.Media.mdp	(original)
+++ trunk/banshee/src/Libraries/Mono.Media/Mono.Media.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Mono.Media" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Mono.Media" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="." assembly="Mono.Media" />

Modified: trunk/banshee/src/Libraries/Mtp/Mtp.mdp
==============================================================================
--- trunk/banshee/src/Libraries/Mtp/Mtp.mdp	(original)
+++ trunk/banshee/src/Libraries/Mtp/Mtp.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="Mtp" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="Mtp" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="Mtp" />

Modified: trunk/banshee/src/Libraries/Mtp/Mtp/MtpDevice.cs
==============================================================================
--- trunk/banshee/src/Libraries/Mtp/Mtp/MtpDevice.cs	(original)
+++ trunk/banshee/src/Libraries/Mtp/Mtp/MtpDevice.cs	Sun May 25 19:48:34 2008
@@ -50,7 +50,7 @@
 		private Folder videoFolder;
 
 		static MtpDevice() {
-			Init();
+			LIBMTP_Init ();
 		}
 		
 		public int BatteryLevel {
@@ -349,11 +349,6 @@
             return new Int16[0];
         }
 		
-		internal static void Init ()
-		{
-			LIBMTP_Init ();
-		}
-
 		internal static void ReleaseDevice (IntPtr handle)
 		{
 			LIBMTP_Release_Device(handle);

Modified: trunk/banshee/src/Libraries/MusicBrainz/MusicBrainz.mdp
==============================================================================
--- trunk/banshee/src/Libraries/MusicBrainz/MusicBrainz.mdp	(original)
+++ trunk/banshee/src/Libraries/MusicBrainz/MusicBrainz.mdp	Sun May 25 19:48:34 2008
@@ -1,4 +1,4 @@
-<Project name="MusicBrainz" fileversion="2.0" language="C#" clr-version="Net_2_0" UseParentDirectoryAsNamespace="True" ctype="DotNetProject">
+<Project name="MusicBrainz" fileversion="2.0" UseParentDirectoryAsNamespace="True" language="C#" clr-version="Net_2_0" ctype="DotNetProject">
   <Configurations active="Debug">
     <Configuration name="Debug" ctype="DotNetProjectConfiguration">
       <Output directory="../../../bin" assembly="MusicBrainz" />



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