banshee r4454 - in trunk/banshee: . build src src/Clients/Muinshee src/Clients/Muinshee/Muinshee src/Clients/Muinshee/Resources src/Clients/Nereid/Nereid src/Core/Banshee.Services/Banshee.Collection.Database src/Core/Banshee.Services/Banshee.Sources src/Core/Banshee.ThickClient src/Core/Banshee.ThickClient/Banshee.Collection.Gui src/Core/Banshee.ThickClient/Banshee.Gui src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs src/Core/Banshee.ThickClient/Banshee.Gui.Widgets src/Libraries/Hyena.Gui src/Libraries/Hyena.Gui/Hyena.Data.Gui src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView src/Libraries/Hyena.Gui/Hyena.Widgets



Author: gburt
Date: Wed Sep  3 15:28:58 2008
New Revision: 4454
URL: http://svn.gnome.org/viewvc/banshee?rev=4454&view=rev

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

	Merged branches/banshee/gburt/ -r4443:4452 to trunk (muinshee, working
	well but no easy way for end users to run it other than cli).


Added:
   trunk/banshee/src/Clients/Muinshee/Muinshee/AlbumDialog.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Clients/Muinshee/Muinshee/AlbumDialog.cs
   trunk/banshee/src/Clients/Muinshee/Muinshee/BaseDialog.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Clients/Muinshee/Muinshee/BaseDialog.cs
   trunk/banshee/src/Clients/Muinshee/Muinshee/MuinsheeTrackInfoDisplay.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Clients/Muinshee/Muinshee/MuinsheeTrackInfoDisplay.cs
   trunk/banshee/src/Clients/Muinshee/Muinshee/SongDialog.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Clients/Muinshee/Muinshee/SongDialog.cs
   trunk/banshee/src/Clients/Muinshee/Resources/
      - copied from r4452, /branches/banshee/gburt/src/Clients/Muinshee/Resources/
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentWindowController.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Core/Banshee.ThickClient/Banshee.Gui/PersistentWindowController.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ITextCell.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ITextCell.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Widgets/ImageButton.cs
      - copied unchanged from r4452, /branches/banshee/gburt/src/Libraries/Hyena.Gui/Hyena.Widgets/ImageButton.cs
Removed:
   trunk/banshee/src/Clients/Muinshee/Muinshee/ViewContainer.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/build/build.environment.mk
   trunk/banshee/src/Clients/Muinshee/Makefile.am
   trunk/banshee/src/Clients/Muinshee/Muinshee.mdp
   trunk/banshee/src/Clients/Muinshee/Muinshee/Client.cs
   trunk/banshee/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs
   trunk/banshee/src/Clients/Muinshee/Muinshee/PlayerInterface.cs
   trunk/banshee/src/Clients/Nereid/Nereid/Client.cs
   trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseAlbumListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
   trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp
   trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.mdp
   trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am
   trunk/banshee/src/Makefile.am

Modified: trunk/banshee/build/build.environment.mk
==============================================================================
--- trunk/banshee/build/build.environment.mk	(original)
+++ trunk/banshee/build/build.environment.mk	Wed Sep  3 15:28:58 2008
@@ -120,6 +120,9 @@
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_PLAYQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+LINK_EXTENSION_PLAYQUEUE = -r:$(DIR_BIN)/Banshee.PlayQueue.dll
+LINK_EXTENSION_PLAYQUEUE_DEPS = $(REF_EXTENSION_PLAYQUEUE) \
+	$(LINK_EXTENSION_PLAYQUEUE)
 REF_EXTENSION_LASTFM = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_MONO_MEDIA) $(LINK_LASTFM) $(LINK_LASTFM_GUI)
 REF_EXTENSION_NOWPLAYING = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 LINK_EXTENSION_NOWPLAYING = -r:$(DIR_BIN)/Banshee.NowPlaying.dll

Modified: trunk/banshee/src/Clients/Muinshee/Makefile.am
==============================================================================
--- trunk/banshee/src/Clients/Muinshee/Makefile.am	(original)
+++ trunk/banshee/src/Clients/Muinshee/Makefile.am	Wed Sep  3 15:28:58 2008
@@ -1,11 +1,17 @@
 ASSEMBLY = Muinshee
 TARGET = exe
-LINK = $(REF_NEREID)
+LINK = $(REF_NEREID) $(LINK_EXTENSION_PLAYQUEUE_DEPS)
 SOURCES =  \
+	Muinshee/AlbumDialog.cs \
+	Muinshee/BaseDialog.cs \
 	Muinshee/Client.cs \
 	Muinshee/MuinsheeActions.cs \
+	Muinshee/MuinsheeTrackInfoDisplay.cs \
 	Muinshee/PlayerInterface.cs \
-	Muinshee/ViewContainer.cs
+	Muinshee/SongDialog.cs
+
+RESOURCES = \
+	Resources/GlobalUI.xml
 
 include $(top_srcdir)/build/build.mk
 

Modified: trunk/banshee/src/Clients/Muinshee/Muinshee.mdp
==============================================================================
--- trunk/banshee/src/Clients/Muinshee/Muinshee.mdp	(original)
+++ trunk/banshee/src/Clients/Muinshee/Muinshee.mdp	Wed Sep  3 15:28:58 2008
@@ -9,9 +9,12 @@
   </Configurations>
   <Contents>
     <File name="Muinshee/PlayerInterface.cs" subtype="Code" buildaction="Compile" />
-    <File name="Muinshee/ViewContainer.cs" subtype="Code" buildaction="Compile" />
     <File name="Muinshee/Client.cs" subtype="Code" buildaction="Compile" />
     <File name="Muinshee/MuinsheeActions.cs" subtype="Code" buildaction="Compile" />
+    <File name="Muinshee/BaseDialog.cs" subtype="Code" buildaction="Compile" />
+    <File name="Muinshee/MuinsheeTrackInfoDisplay.cs" subtype="Code" buildaction="Compile" />
+    <File name="Muinshee/SongDialog.cs" subtype="Code" buildaction="Compile" />
+    <File name="Muinshee/AlbumDialog.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.10.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
@@ -23,6 +26,7 @@
     <ProjectReference type="Project" localcopy="False" refto="Hyena" />
     <ProjectReference type="Project" localcopy="False" refto="Hyena.Gui" />
     <ProjectReference type="Gac" localcopy="True" refto="gdk-sharp, Version=2.10.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+    <ProjectReference type="Project" localcopy="True" refto="Banshee.PlayQueue" />
   </References>
   <GtkDesignInfo gtkVersion="2.12.1" />
   <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="True" RelativeMakefileName="Makefile.am" ExecuteTargetName="run">

Modified: trunk/banshee/src/Clients/Muinshee/Muinshee/Client.cs
==============================================================================
--- trunk/banshee/src/Clients/Muinshee/Muinshee/Client.cs	(original)
+++ trunk/banshee/src/Clients/Muinshee/Muinshee/Client.cs	Wed Sep  3 15:28:58 2008
@@ -43,165 +43,15 @@
 {
     public class Client : Banshee.Gui.GtkBaseClient
     {
-        private static string user_gtkrc = Path.Combine (Paths.ApplicationData, "gtkrc"); 
         public static void Main (string [] args)
         {
-            if (CheckHelpVersion ()) {
-                return;
-            }
-        
-            // Check for single instance
-            DBusConnection.Connect ();
-            if (DBusConnection.InstanceAlreadyRunning) {
-                // Try running our friend Halie, the DBus command line client
-                AppDomain.CurrentDomain.ExecuteAssembly (Path.Combine (Path.GetDirectoryName (
-                    Assembly.GetEntryAssembly ().Location), "Halie.exe"));
-                Gdk.Global.InitCheck (ref args);
-                Gdk.Global.NotifyStartupComplete ();
-                return;
-            }
-                    
-            Hyena.Log.InformationFormat ("Running Banshee {0}", Application.Version);
-            
-            // This could go into GtkBaseClient, but it's probably something we
-            // should really only support at each client level
-            if (File.Exists (user_gtkrc) && !ApplicationContext.CommandLine.Contains ("no-gtkrc")) {
-                Gtk.Rc.AddDefaultFile (user_gtkrc);
-            } 
-            
-            // Ugly hack to avoid stupid themes that set this to 0, causing a huge
-            // bug when constructing the "add to playlist" popup menu (BGO #524706)
-            Gtk.Rc.ParseString ("gtk-menu-popup-delay = 225");
-
-            // Boot the client
-            Banshee.Gui.GtkBaseClient.Entry<Client> ();
+            Startup<Muinshee.Client> (args);
         }
         
         protected override void OnRegisterServices ()
         {
             // Register the main interface
-            ServiceManager.RegisterService<PlayerInterface> ();
-        }
-        
-        private static bool CheckHelpVersion ()
-        {
-            if (ApplicationContext.CommandLine.ContainsStart ("help")) {
-                ShowHelp ();
-                return true;
-            } else if (ApplicationContext.CommandLine.Contains ("version")) {
-                ShowVersion ();
-                return true;
-            }
-            
-            return false;
-        }
-        
-        private static void ShowHelp ()
-        {
-            Console.WriteLine ("Usage: {0} [options...] [files|URIs...]", "banshee-1");
-            Console.WriteLine ();
-            
-            Layout commands = new Layout (
-                new LayoutGroup ("help", Catalog.GetString ("Help Options"),
-                    new LayoutOption ("help", Catalog.GetString ("Show this help")),
-                    new LayoutOption ("help-playback", Catalog.GetString ("Show options for controlling playback")),
-                    new LayoutOption ("help-query-track", Catalog.GetString ("Show options for querying the playing track")),
-                    new LayoutOption ("help-query-player", Catalog.GetString ("Show options for querying the playing engine")),
-                    new LayoutOption ("help-ui", Catalog.GetString ("Show options for the user interface")),
-                    new LayoutOption ("help-debug", Catalog.GetString ("Show options for developers and debugging")),
-                    new LayoutOption ("help-all", Catalog.GetString ("Show all option groups")),
-                    new LayoutOption ("version", Catalog.GetString ("Show version information"))
-                ),
-                
-                new LayoutGroup ("playback", Catalog.GetString ("Playback Control Options"),
-                    new LayoutOption ("next", Catalog.GetString ("Play the next track, optionally restarting if the 'restart' value is set")),
-                    new LayoutOption ("previous", Catalog.GetString ("Play the previous track, optionally restarting if the 'restart value is set")),
-                    new LayoutOption ("play-enqueued", Catalog.GetString ("Automatically start playing any tracks enqueued on the command line")),
-                    new LayoutOption ("play", Catalog.GetString ("Start playback")),
-                    new LayoutOption ("pause", Catalog.GetString ("Pause playback")),
-                    new LayoutOption ("stop", Catalog.GetString ("Completely stop playback")),
-                    new LayoutOption ("stop-when-finished", Catalog.GetString (
-                        "Enable or disable playback stopping after the currently playing track (value should be either 'true' or 'false')")),
-                    new LayoutOption ("set-volume=LEVEL", Catalog.GetString ("Set the playback volume (0-100)")),
-                    new LayoutOption ("set-position=POS", Catalog.GetString ("Seek to a specific point (seconds, float)"))
-                ),
-                
-                new LayoutGroup ("query-player", Catalog.GetString ("Player Engine Query Options"),
-                    new LayoutOption ("query-current-state", Catalog.GetString ("Current player state")),
-                    new LayoutOption ("query-last-state", Catalog.GetString ("Last player state")),
-                    new LayoutOption ("query-can-pause", Catalog.GetString ("Query whether the player can be paused")),
-                    new LayoutOption ("query-can-seek", Catalog.GetString ("Query whether the player can seek")),
-                    new LayoutOption ("query-volume", Catalog.GetString ("Player volume")),
-                    new LayoutOption ("query-position", Catalog.GetString ("Player position in currently playing track"))
-                ),
-                
-                new LayoutGroup ("query-track", Catalog.GetString ("Playing Track Metadata Query Options"),
-                    new LayoutOption ("query-uri", Catalog.GetString ("URI")),
-                    new LayoutOption ("query-artist", Catalog.GetString ("Artist Name")),
-                    new LayoutOption ("query-album", Catalog.GetString ("Album Title")),
-                    new LayoutOption ("query-title", Catalog.GetString ("Track Title")),
-                    new LayoutOption ("query-duration", Catalog.GetString ("Duration")),
-                    new LayoutOption ("query-track-number", Catalog.GetString ("Track Number")),
-                    new LayoutOption ("query-track-count", Catalog.GetString ("Track Count")),
-                    new LayoutOption ("query-disc", Catalog.GetString ("Disc Number")),
-                    new LayoutOption ("query-year", Catalog.GetString ("Year")),
-                    new LayoutOption ("query-rating", Catalog.GetString ("Rating"))
-                ),
-                
-                new LayoutGroup ("ui", Catalog.GetString ("User Interface Options"),
-                    new LayoutOption ("show|--present", Catalog.GetString ("Present the user interface on the active workspace")),
-                    new LayoutOption ("hide", Catalog.GetString ("Hide the user interface")),
-                    new LayoutOption ("no-present", Catalog.GetString ("Do not present the user interface, regardless of any other options"))
-                ),
-                
-                new LayoutGroup ("debugging", Catalog.GetString ("Debugging and Development Options"), 
-                    new LayoutOption ("debug", Catalog.GetString ("Enable general debugging features")),
-                    new LayoutOption ("debug-sql", Catalog.GetString ("Enable debugging output of SQL queries")),
-                    new LayoutOption ("debug-addins", Catalog.GetString ("Enable debugging output of Mono.Addins")),
-                    new LayoutOption ("db=FILE", Catalog.GetString ("Specify an alternate database to use")),
-                    new LayoutOption ("uninstalled", Catalog.GetString ("Optimize instance for running uninstalled; " + 
-                        "most notably, this will create an alternate Mono.Addins database in the working directory")),
-                    new LayoutOption ("disable-dbus", Catalog.GetString ("Disable DBus support completely")),
-                    new LayoutOption ("no-gtkrc", String.Format (Catalog.GetString (
-                        "Skip loading a custom gtkrc file ({0}) if it exists"), 
-                        user_gtkrc.Replace (Environment.GetFolderPath (Environment.SpecialFolder.Personal), "~")))
-                )
-            );
-            
-            if (ApplicationContext.CommandLine.Contains ("help-all")) {
-                Console.WriteLine (commands);
-                return;
-            }
-            
-            List<string> errors = null;
-            
-            foreach (KeyValuePair<string, string> argument in ApplicationContext.CommandLine.Arguments) {
-                switch (argument.Key) {
-                    case "help": Console.WriteLine (commands.ToString ("help")); break;
-                    case "help-debug": Console.WriteLine (commands.ToString ("debugging")); break;
-                    case "help-query-track": Console.WriteLine (commands.ToString ("query-track")); break;
-                    case "help-query-player": Console.WriteLine (commands.ToString ("query-player")); break;
-                    case "help-ui": Console.WriteLine (commands.ToString ("ui")); break;
-                    case "help-playback": Console.WriteLine (commands.ToString ("playback")); break;
-                    default:
-                        if (argument.Key.StartsWith ("help")) {
-                            (errors ?? errors = new List<string> ()).Add (argument.Key);
-                        }
-                        break;
-                }
-            }
-            
-            if (errors != null) {
-                Console.WriteLine (commands.LayoutLine (String.Format (Catalog.GetString (
-                    "The following help arguments are invalid: {0}"),
-                    Hyena.Collections.CollectionExtensions.Join (errors, "--", null, ", "))));
-            }
-        }
-        
-        private static void ShowVersion ()
-        {
-            Console.WriteLine ("Banshee {0} ({1}) http://banshee-project.org";, Application.DisplayVersion, Application.Version);
-            Console.WriteLine ("Copyright 2005-{0} Novell, Inc. and Contributors.", DateTime.Now.Year);
+            ServiceManager.RegisterService<Muinshee.PlayerInterface> ();
         }
         
         public override string ClientId {

Modified: trunk/banshee/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs
==============================================================================
--- trunk/banshee/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs	(original)
+++ trunk/banshee/src/Clients/Muinshee/Muinshee/MuinsheeActions.cs	Wed Sep  3 15:28:58 2008
@@ -35,31 +35,41 @@
 namespace Muinshee
 {
     public class MuinsheeActions : BansheeActionGroup
-    {       
-        public MuinsheeActions () : base ("muinshee")
+    {
+        private Banshee.Playlist.PlaylistSource queue;
+        
+        public MuinsheeActions (Banshee.Playlist.PlaylistSource queue) : base ("muinshee")
         {
+            this.queue = queue;
             AddImportant (
                 new ActionEntry (
                     "PlaySongAction", Stock.Add,
-                     Catalog.GetString ("_Play Song"),
-                     null, Catalog.GetString ("Add a song to the playlist"), OnPlaySong
+                     Catalog.GetString ("Play _Song"), "S",
+                     Catalog.GetString ("Add a song to the playlist"), OnPlaySong
                 ),
                 new ActionEntry (
-                    "PlayAlbumAction", Stock.Add,
-                     Catalog.GetString ("_Play Album"),
-                     null, Catalog.GetString ("Add an album to the playlist"), OnPlayAlbum
+                    "PlayAlbumAction", null,
+                     Catalog.GetString ("Play _Album"), "A",
+                     Catalog.GetString ("Add an album to the playlist"), OnPlayAlbum
                 )
             );
+
+            this["PlayAlbumAction"].IconName = "media-optical";
+
+            // TODO disable certain actions
+            // Actions.TrackActions.UpdateActions (false, false, "SearchMenu");
             
             AddUiFromFile ("GlobalUI.xml");
         }
 
         private void OnPlaySong (object sender, EventArgs args)
         {
+            new SongDialog (queue).TryRun ();
         }
 
         private void OnPlayAlbum (object sender, EventArgs args)
         {
+            new AlbumDialog (queue).TryRun ();
         }
     }
 }

Modified: trunk/banshee/src/Clients/Muinshee/Muinshee/PlayerInterface.cs
==============================================================================
--- trunk/banshee/src/Clients/Muinshee/Muinshee/PlayerInterface.cs	(original)
+++ trunk/banshee/src/Clients/Muinshee/Muinshee/PlayerInterface.cs	Wed Sep  3 15:28:58 2008
@@ -52,65 +52,74 @@
 using Banshee.Collection.Gui;
 using Banshee.Sources.Gui;
 
+using Banshee.PlayQueue;
+
 namespace Muinshee
 {
-    public class PlayerInterface : BaseClientWindow, IClientWindow, IDBusObjectName, IService, IDisposable, IHasSourceView
+    public class PlayerInterface : BaseClientWindow, IClientWindow, IDBusObjectName, IService, IDisposable
     {
         // Major Layout Components
-        private VBox primary_vbox;
+        private VBox content_vbox;
+        private VBox main_vbox;
         private Toolbar header_toolbar;
-        private Toolbar footer_toolbar;
-        private HPaned views_pane;
-        private ViewContainer view_container;
 
         private MuinsheeActions actions;
         
         // Major Interaction Components
-        private SourceView source_view;
-        private CompositeTrackSourceContents composite_view;
-        private ObjectListSourceContents object_view;
-        private Label status_label;
+        private TerseTrackListView track_view;
+        private Label list_label;
         
-        public PlayerInterface () : base (Catalog.GetString ("Banshee Media Player"))
+        public PlayerInterface () : base (Catalog.GetString ("Banshee Media Player"), "muinshee", -1, 450)
         {
         }
-        
+
         protected override void Initialize ()
         {
-            actions = new MuinsheeActions ();
+            FindPlayQueue ();
+        }
+
+        private void FindPlayQueue ()
+        {
+            Banshee.ServiceStack.ServiceManager.SourceManager.SourceAdded += delegate (SourceAddedArgs args) {
+                if (args.Source is Banshee.PlayQueue.PlayQueueSource) {
+                    InitPlayQueue (args.Source as Banshee.PlayQueue.PlayQueueSource);
+                }
+            };
+
+            foreach (Source src in ServiceManager.SourceManager.Sources) {
+                if (src is Banshee.PlayQueue.PlayQueueSource) {
+                    InitPlayQueue (src as Banshee.PlayQueue.PlayQueueSource);
+                }
+            }
+        }
+
+        private void InitPlayQueue (PlayQueueSource play_queue)
+        {
+            actions = new MuinsheeActions (play_queue);
+            actions.Actions.AddActionGroup (actions);
+            ServiceManager.SourceManager.SetActiveSource (play_queue);
+            play_queue.TrackModel.Reloaded += HandleTrackModelReloaded;
 
             BuildPrimaryLayout ();
             ConnectEvents ();
 
-            ActionService.SourceActions.SourceView = this;
-            
-            composite_view.TrackView.HasFocus = true;
-            
+            // FIXME
+            //AddAccelGroup (ActionService.UIManager.AccelGroup);
+
+            track_view.SetModel (play_queue.TrackModel);
+
             Show ();
         }
-        
-        protected override void UpdateTitle ()
-        {
-            TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
-            if (track != null) {
-                // Translators: this is the window title when a track is playing
-                //              {0} is the track title, {1} is the artist name
-                Title = String.Format (Catalog.GetString ("{0} by {1}"), 
-                    track.DisplayTrackTitle, track.DisplayArtistName);
-            } else {
-                Title = Catalog.GetString ("Banshee Media Player");
-            }
-            
-            OnTitleChanged ();
-        }
-        
+
 #region System Overrides 
         
         public override void Dispose ()
         {
             lock (this) {
                 Hide ();
-                actions.Dispose ();
+                if (actions != null) {
+                    actions.Dispose ();
+                }
                 base.Dispose ();
                 Gtk.Application.Quit ();
             }
@@ -122,18 +131,26 @@
         
         private void BuildPrimaryLayout ()
         {
-            primary_vbox = new VBox ();
+            main_vbox = new VBox ();
             
             Widget menu = new MainMenu ();
             menu.Show ();
-            primary_vbox.PackStart (menu, false, false, 0);
+            main_vbox.PackStart (menu, false, false, 0);
            
             BuildHeader ();
+
+            content_vbox = new VBox ();
+            content_vbox.Spacing = 6;
+            Alignment content_align = new Alignment (0f, 0f, 1f, 1f);
+            content_align.LeftPadding = content_align.RightPadding = 6;
+            content_align.Child = content_vbox;
+            main_vbox.PackStart (content_align, true, true, 0);
+
+            BuildTrackInfo ();
             BuildViews ();
-            BuildFooter ();
             
-            primary_vbox.Show ();
-            Add (primary_vbox);
+            main_vbox.ShowAll ();
+            Add (main_vbox);
         }
         
         private void BuildHeader ()
@@ -142,340 +159,81 @@
             toolbar_alignment.TopPadding = 3;
             toolbar_alignment.BottomPadding = 3;
             
-            header_toolbar = (Toolbar)ActionService.UIManager.GetWidget ("/HeaderToolbar");
+            header_toolbar = (Toolbar)ActionService.UIManager.GetWidget ("/MuinsheeHeaderToolbar");
             header_toolbar.ShowArrow = false;
             header_toolbar.ToolbarStyle = ToolbarStyle.BothHoriz;
             
             toolbar_alignment.Add (header_toolbar);
             toolbar_alignment.ShowAll ();
             
-            primary_vbox.PackStart (toolbar_alignment, false, false, 0);
+            main_vbox.PackStart (toolbar_alignment, false, false, 0);
             
             Widget next_button = new NextButton (ActionService);
             next_button.Show ();
-            ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/NextArrowButton", next_button);
-            
-            ConnectedSeekSlider seek_slider = new ConnectedSeekSlider ();
-            seek_slider.Show ();
-            ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/SeekSlider", seek_slider);
-            
-            TrackInfoDisplay track_info_display = new ClassicTrackInfoDisplay ();
-            track_info_display.Show ();
-            ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/TrackInfoDisplay", track_info_display, true);
+            ActionService.PopulateToolbarPlaceholder (header_toolbar, "/MuinsheeHeaderToolbar/NextArrowButton", next_button);
             
             ConnectedVolumeButton volume_button = new ConnectedVolumeButton ();
             volume_button.Show ();
-            ActionService.PopulateToolbarPlaceholder (header_toolbar, "/HeaderToolbar/VolumeButton", volume_button);
+            ActionService.PopulateToolbarPlaceholder (header_toolbar, "/MuinsheeHeaderToolbar/VolumeButton", volume_button);
         }
 
-        private void BuildViews ()
+        private const int info_height = 64;
+        private void BuildTrackInfo ()
         {
-            VBox source_box = new VBox ();
-            
-            views_pane = new HPaned ();
-            PersistentPaneController.Control (views_pane, SourceViewWidth);
-            view_container = new ViewContainer ();
-            
-            source_view = new SourceView ();
-            composite_view = new CompositeTrackSourceContents ();
-            
-            Hyena.Widgets.ScrolledWindow source_scroll = new Hyena.Widgets.ScrolledWindow ();
-            source_scroll.AddWithFrame (source_view);       
-            
-            composite_view.TrackView.HeaderVisible = false;
-            view_container.Content = composite_view;
-            
-            source_box.PackStart (source_scroll, true, true, 0);
-            source_box.PackStart (new UserJobTileHost (), false, false, 0);
-            
-            source_view.SetSizeRequest (125, -1);
-            view_container.SetSizeRequest (425, -1);
-            
-            views_pane.Pack1 (source_box, false, false);
-            views_pane.Pack2 (view_container, true, false);
-            
-            source_box.ShowAll ();
-            view_container.Show ();
-            views_pane.Show ();
-            
-            primary_vbox.PackStart (views_pane, true, true, 0);
+            TrackInfoDisplay track_info_display = new MuinsheeTrackInfoDisplay ();
+            if (track_info_display.HeightRequest < info_height) {
+                track_info_display.HeightRequest = info_height;
+            }
+            track_info_display.Show ();
+            content_vbox.PackStart (track_info_display, false, false, 0);
+
+            ConnectedSeekSlider seek_slider = new ConnectedSeekSlider (SeekSliderLayout.Horizontal);
+            seek_slider.LeftPadding = seek_slider.RightPadding = 0;
+            content_vbox.PackStart (seek_slider, false, false, 0);
         }
 
-        private void BuildFooter ()
+        private void BuildViews ()
         {
-            footer_toolbar = (Toolbar)ActionService.UIManager.GetWidget ("/FooterToolbar");
-            footer_toolbar.ShowArrow = false;
-            footer_toolbar.ToolbarStyle = ToolbarStyle.BothHoriz;
-
-            EventBox status_event_box = new EventBox ();
-            status_event_box.ButtonPressEvent += delegate (object o, ButtonPressEventArgs args) {
-                Source source = ServiceManager.SourceManager.ActiveSource;
-                if (source != null) {
-                    source.CycleStatusFormat ();
-                    UpdateSourceInformation ();
-                }
-            };
-            status_label = new Label ();
-            status_event_box.Add (status_label);
-            
-            Alignment status_align = new Alignment (0.5f, 0.5f, 1.0f, 1.0f);
-            status_align.Add (status_event_box);
-
-            RepeatActionButton repeat_button = new RepeatActionButton ();
-            repeat_button.SizeAllocated += delegate (object o, Gtk.SizeAllocatedArgs args) {
-                status_align.LeftPadding = (uint)args.Allocation.Width;
-            };
-
-            ActionService.PopulateToolbarPlaceholder (footer_toolbar, "/FooterToolbar/StatusBar", status_align, true);
-            ActionService.PopulateToolbarPlaceholder (footer_toolbar, "/FooterToolbar/RepeatButton", repeat_button);
-
-            footer_toolbar.ShowAll ();
-            primary_vbox.PackStart (footer_toolbar, false, true, 0);
+            track_view = new TerseTrackListView ();
+            track_view.HasFocus = true;
+            track_view.ColumnController.Insert (new Column (null, "indicator", new ColumnCellStatusIndicator (null), 0.05, true, 20, 20), 0);
+
+            Hyena.Widgets.ScrolledWindow sw = new Hyena.Widgets.ScrolledWindow ();
+            sw.Add (track_view);
+            /*window.Add (view);
+            window.HscrollbarPolicy = PolicyType.Automatic;
+            window.VscrollbarPolicy = PolicyType.Automatic;*/
+
+            list_label = new Label ();
+            list_label.Xalign = 0f;
+            content_vbox.PackStart (list_label, false, false, 0);
+            content_vbox.PackStart (sw, true, true, 0);
+            content_vbox.PackStart (new UserJobTileHost (), false, false, 0);
+            track_view.SetSizeRequest (425, -1);
         }
 
 #endregion
         
 #region Events and Logic Setup
         
-        private void ConnectEvents ()
+        protected override void ConnectEvents ()
         {
-            // Service events
-            ServiceManager.SourceManager.ActiveSourceChanged += OnActiveSourceChanged;
+            base.ConnectEvents ();
             ServiceManager.SourceManager.SourceUpdated += OnSourceUpdated;
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
-                PlayerEvent.StartOfStream |
-                PlayerEvent.TrackInfoUpdated |
-                PlayerEvent.EndOfStream);
-            
-            ActionService.TrackActions ["SearchForSameArtistAction"].Activated += OnProgrammaticSearch;
-            ActionService.TrackActions ["SearchForSameAlbumAction"].Activated += OnProgrammaticSearch;
-
-            // UI events
-            view_container.SearchEntry.Changed += OnSearchEntryChanged;
-            views_pane.SizeRequested += delegate {
-                SourceViewWidth.Set (views_pane.Position);
-            };
-            
-            source_view.RowActivated += delegate {
-                Source source = ServiceManager.SourceManager.ActiveSource;
-                if (source is ITrackModelSource) {
-                    ServiceManager.PlaybackController.NextSource = (ITrackModelSource)source;
-                    // Allow changing the play source without stopping the current song by
-                    // holding ctrl when activating a source. After the song is done, playback will
-                    // continue from the new source.
-                    if (GtkUtilities.NoImportantModifiersAreSet (Gdk.ModifierType.ControlMask)) {
-                        ServiceManager.PlaybackController.Next ();
-                    }
-                }
-            };
-            
             header_toolbar.ExposeEvent += OnToolbarExposeEvent;
-            footer_toolbar.ExposeEvent += OnToolbarExposeEvent;
         }
         
 #endregion
 
 #region Service Event Handlers
 
-        private void OnProgrammaticSearch (object o, EventArgs args)
-        {
-            Source source = ServiceManager.SourceManager.ActiveSource;
-            view_container.SearchEntry.Ready = false;
-            view_container.SearchEntry.Query = source.FilterQuery;
-            view_container.SearchEntry.Ready = true;
-        }
-        
-        private Source previous_source = null;
-        private TrackListModel previous_track_model = null;
-        private void OnActiveSourceChanged (SourceEventArgs args)
-        {
-            Banshee.Base.ThreadAssist.ProxyToMain (delegate {
-                Source source = ServiceManager.SourceManager.ActiveSource;
-    
-                view_container.SearchSensitive = source != null && source.CanSearch;
-                
-                if (source == null) {
-                    return;
-                }
-                
-                view_container.Title = source.Name;
-                view_container.SearchEntry.Ready = false;
-                view_container.SearchEntry.CancelSearch ();
-    
-                if (source.FilterQuery != null) {
-                    view_container.SearchEntry.Query = source.FilterQuery;
-                    view_container.SearchEntry.ActivateFilter ((int)source.FilterType);
-                }
-    
-                if (view_container.Content != null) {
-                    view_container.Content.ResetSource ();
-                }
-    
-                if (previous_track_model != null) {
-                    previous_track_model.Reloaded -= HandleTrackModelReloaded;
-                    previous_track_model = null;
-                }
-    
-                if (source is ITrackModelSource) {
-                    previous_track_model = (source as ITrackModelSource).TrackModel;
-                    previous_track_model.Reloaded += HandleTrackModelReloaded;
-                }
-                
-                if (previous_source != null) {
-                    previous_source.Properties.PropertyChanged -= OnSourcePropertyChanged;
-                }
-                
-                previous_source = source;
-                previous_source.Properties.PropertyChanged += OnSourcePropertyChanged;
-                
-                UpdateSourceContents (source);
-                
-                UpdateSourceInformation ();
-                view_container.SearchEntry.Ready = true;
-            });
-        }
-        
-        private void OnSourcePropertyChanged (object o, PropertyChangeEventArgs args)
-        {
-            if (args.PropertyName == "Nereid.SourceContents") {
-                UpdateSourceContents (previous_source);
-            }
-        }
-        
-        private void UpdateSourceContents (Source source)
-        {
-            if (source == null) {
-                return;
-            }
-            
-            // Connect the source models to the views if possible
-            ISourceContents contents = source.GetInheritedProperty<bool> ("Nereid.SourceContentsPropagate")
-                ? source.GetInheritedProperty<ISourceContents> ("Nereid.SourceContents")
-                : source.Properties.Get<ISourceContents> ("Nereid.SourceContents");
-            
-            if (contents != null) {
-                if (view_container.Content != contents) {
-                    view_container.Content = contents;
-                }
-                view_container.Content.SetSource (source);
-                view_container.Show ();
-            } else if (source is ITrackModelSource) {
-                view_container.Content = composite_view;
-                view_container.Content.SetSource (source);
-                view_container.Show ();
-            } else if (source is Hyena.Data.IObjectListModel) {
-                if (object_view == null) {
-                    object_view = new ObjectListSourceContents ();
-                }
-                
-                view_container.Content = object_view;
-                view_container.Content.SetSource (source);
-                view_container.Show ();
-            } else {
-                view_container.Hide ();
-            }
-
-            // Associate the view with the model
-            if (view_container.Visible && view_container.Content is ITrackModelSourceContents) {
-                ITrackModelSourceContents track_content = view_container.Content as ITrackModelSourceContents;
-                source.Properties.Set<IListView<TrackInfo>>  ("Track.IListView", track_content.TrackView);
-            }
-
-            view_container.Header.Visible = source.Properties.Contains ("Nereid.SourceContents.HeaderVisible") ?
-                source.Properties.Get<bool> ("Nereid.SourceContents.HeaderVisible") : true;
-            
-            view_container.ClearFooter ();
-            Widget footer_widget = null;
-            
-            if (source.Properties.Contains ("Nereid.SourceContents.FooterWidget")) {
-                footer_widget = source.Properties.Get<Widget> ("Nereid.SourceContents.FooterWidget");
-            }
-            
-            if (footer_widget != null) {
-                view_container.SetFooter (footer_widget);
-            }
-        }
-
         private void OnSourceUpdated (SourceEventArgs args)
         {
             if (args.Source == ServiceManager.SourceManager.ActiveSource) {
                 UpdateSourceInformation ();
-                view_container.Title = args.Source.Name;
             }
         }
         
-        private void OnPlayerEvent (PlayerEventArgs args) 
-        {
-            UpdateTitle ();
-        }
-        
-#endregion
-
-#region UI Event Handlers
-        
-        private void OnSearchEntryChanged (object o, EventArgs args)
-        {
-            Source source = ServiceManager.SourceManager.ActiveSource;
-            if (source == null)
-                return;
-            
-            source.FilterType = (TrackFilterType)view_container.SearchEntry.ActiveFilterID;
-            source.FilterQuery = view_container.SearchEntry.Query;
-        }
-        
-        private void OnToolbarExposeEvent (object o, ExposeEventArgs args)
-        {
-            Toolbar toolbar = (Toolbar)o;
-
-            // This forces the toolbar to look like it's just a regular part
-            // of the window since the stock toolbar look makes Banshee look ugly.
-            Style.ApplyDefaultBackground (toolbar.GdkWindow, true, State, 
-                args.Event.Area, toolbar.Allocation.X, toolbar.Allocation.Y, 
-                toolbar.Allocation.Width, toolbar.Allocation.Height);
-
-            // Manually expose all the toolbar's children
-            foreach (Widget child in toolbar.Children) {
-                toolbar.PropagateExpose (child, args.Event);
-            }
-        }
-        
-#endregion
-
-#region Implement Interfaces
-
-        // IHasTrackSelection
-        /*public IEnumerable<TrackInfo> GetSelectedTracks ()
-        {
-            return new ModelSelection<TrackInfo> (composite_view.TrackModel, composite_view.TrackView.Selection);
-        }
-
-        public Hyena.Collections.SelectionProxy TrackSelectionProxy {
-            get { return composite_view.TrackView.SelectionProxy; }
-        }
-
-        public DatabaseTrackListModel TrackModel {
-            get { return composite_view.TrackModel as DatabaseTrackListModel; }
-        }*/
-
-        // IHasSourceView
-        public Source HighlightedSource {
-            get { return source_view.HighlightedSource; }
-        }
-
-        public void BeginRenameSource (Source source)
-        {
-            source_view.BeginRenameSource (source);
-        }
-        
-        public void ResetHighlight ()
-        {
-            source_view.ResetHighlight ();
-        }
-
-        public override Box ViewContainer {
-            get { return view_container; }
-        }
-
 #endregion
         
 #region Gtk.Window Overrides
@@ -491,47 +249,6 @@
 
             (o as Widget).FocusOutEvent -= OnEntryFocusOutEvent;
         }
-        
-        protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
-        {
-            bool focus_search = false;
-            
-            if (Focus is Gtk.Entry && (GtkUtilities.NoImportantModifiersAreSet () && 
-                evnt.Key != Gdk.Key.Control_L && evnt.Key != Gdk.Key.Control_R)) {
-                if (accel_group_active) {
-                    RemoveAccelGroup (ActionService.UIManager.AccelGroup);
-                    accel_group_active = false;
-
-                    // Reinstate the AccelGroup as soon as the focus leaves the entry
-                    Focus.FocusOutEvent += OnEntryFocusOutEvent;
-                 }
-            } else {
-                if (!accel_group_active) {
-                    AddAccelGroup (ActionService.UIManager.AccelGroup);
-                    accel_group_active = true;
-                }
-            }
-            
-            switch (evnt.Key) {
-                case Gdk.Key.f:
-                    if (Gdk.ModifierType.ControlMask == (evnt.State & Gdk.ModifierType.ControlMask)) {
-                        focus_search = true;
-                    }
-                    break;
-
-                case Gdk.Key.S:  case Gdk.Key.s:
-                case Gdk.Key.F3: case Gdk.Key.slash:
-                    focus_search = true;
-                    break;
-            }
-
-            if (focus_search && !view_container.SearchEntry.HasFocus && !source_view.EditingRow) {
-                view_container.SearchEntry.HasFocus = true;
-                return true;
-            }
-            
-            return base.OnKeyPressEvent (evnt);
-        }
 
 #endregion
 
@@ -544,33 +261,20 @@
 
         private void UpdateSourceInformation ()
         {
-            Source source = ServiceManager.SourceManager.ActiveSource;
-            if (source == null) {
-                status_label.Text = String.Empty;
-                return;
+            DatabaseSource source = ServiceManager.SourceManager.ActiveSource as DatabaseSource;
+            if (source != null) {
+                System.Text.StringBuilder sb = new System.Text.StringBuilder ();
+                Source.DurationStatusFormatters[source.CurrentStatusFormat] (sb, source.Duration);
+                list_label.Markup = String.Format ("<b>{0}</b> ({1})",
+                    source.Name, String.Format (Catalog.GetString ("{0} remaining"), sb.ToString ())
+                );
             }
-
-            status_label.Text = source.GetStatusText ();
         }
 
 #endregion
 
 #region Configuration Schemas
 
-        public static readonly SchemaEntry<int> SourceViewWidth = new SchemaEntry<int> (
-            "player_window", "source_view_width",
-            175,
-            "Source View Width",
-            "Width of Source View Column."
-        );
-
-        public static readonly SchemaEntry<bool> ShowCoverArt = new SchemaEntry<bool> (
-            "player_window", "show_cover_art",
-            true,
-            "Show cover art",
-            "Show cover art below source view if available"
-        );
-
 #endregion
 
         IDBusExportable IDBusExportable.Parent {
@@ -578,11 +282,11 @@
         }
         
         string IDBusObjectName.ExportObjectName {
-            get { return "ClientWindow"; }
+            get { return "MuinsheeClientWindow"; }
         }
 
         string IService.ServiceName {
-            get { return "NereidPlayerInterface"; }
+            get { return "MuinsheePlayerInterface"; }
         }
     }
 }

Modified: trunk/banshee/src/Clients/Nereid/Nereid/Client.cs
==============================================================================
--- trunk/banshee/src/Clients/Nereid/Nereid/Client.cs	(original)
+++ trunk/banshee/src/Clients/Nereid/Nereid/Client.cs	Wed Sep  3 15:28:58 2008
@@ -43,167 +43,16 @@
 {
     public class Client : Banshee.Gui.GtkBaseClient
     {
-        private static string user_gtkrc = Path.Combine (Paths.ApplicationData, "gtkrc"); 
         public static void Main (string [] args)
         {
-            if (CheckHelpVersion ()) {
-                return;
-            }
-        
-            // Check for single instance
-            DBusConnection.Connect ();
-            if (DBusConnection.InstanceAlreadyRunning) {
-                // Try running our friend Halie, the DBus command line client
-                AppDomain.CurrentDomain.ExecuteAssembly (Path.Combine (Path.GetDirectoryName (
-                    Assembly.GetEntryAssembly ().Location), "Halie.exe"));
-                Gdk.Global.InitCheck (ref args);
-                Gdk.Global.NotifyStartupComplete ();
-                return;
-            }
-                    
-            Hyena.Log.InformationFormat ("Running Banshee {0}", Application.Version);
-            
-            // This could go into GtkBaseClient, but it's probably something we
-            // should really only support at each client level
-            if (File.Exists (user_gtkrc) && !ApplicationContext.CommandLine.Contains ("no-gtkrc")) {
-                Gtk.Rc.AddDefaultFile (user_gtkrc);
-            } 
-            
-            // Ugly hack to avoid stupid themes that set this to 0, causing a huge
-            // bug when constructing the "add to playlist" popup menu (BGO #524706)
-            Gtk.Rc.ParseString ("gtk-menu-popup-delay = 225");
-
-            // Boot the client
-            Banshee.Gui.GtkBaseClient.Entry<Client> ();
+            Startup<Nereid.Client> (args);
         }
         
         protected override void OnRegisterServices ()
         {
-            // Register the main interface
-            ServiceManager.RegisterService<PlayerInterface> ();
+            ServiceManager.RegisterService<Nereid.PlayerInterface> ();
         }
-        
-        private static bool CheckHelpVersion ()
-        {
-            if (ApplicationContext.CommandLine.ContainsStart ("help")) {
-                ShowHelp ();
-                return true;
-            } else if (ApplicationContext.CommandLine.Contains ("version")) {
-                ShowVersion ();
-                return true;
-            }
-            
-            return false;
-        }
-        
-        private static void ShowHelp ()
-        {
-            Console.WriteLine ("Usage: {0} [options...] [files|URIs...]", "banshee-1");
-            Console.WriteLine ();
-            
-            Layout commands = new Layout (
-                new LayoutGroup ("help", Catalog.GetString ("Help Options"),
-                    new LayoutOption ("help", Catalog.GetString ("Show this help")),
-                    new LayoutOption ("help-playback", Catalog.GetString ("Show options for controlling playback")),
-                    new LayoutOption ("help-query-track", Catalog.GetString ("Show options for querying the playing track")),
-                    new LayoutOption ("help-query-player", Catalog.GetString ("Show options for querying the playing engine")),
-                    new LayoutOption ("help-ui", Catalog.GetString ("Show options for the user interface")),
-                    new LayoutOption ("help-debug", Catalog.GetString ("Show options for developers and debugging")),
-                    new LayoutOption ("help-all", Catalog.GetString ("Show all option groups")),
-                    new LayoutOption ("version", Catalog.GetString ("Show version information"))
-                ),
-                
-                new LayoutGroup ("playback", Catalog.GetString ("Playback Control Options"),
-                    new LayoutOption ("next", Catalog.GetString ("Play the next track, optionally restarting if the 'restart' value is set")),
-                    new LayoutOption ("previous", Catalog.GetString ("Play the previous track, optionally restarting if the 'restart value is set")),
-                    new LayoutOption ("play-enqueued", Catalog.GetString ("Automatically start playing any tracks enqueued on the command line")),
-                    new LayoutOption ("play", Catalog.GetString ("Start playback")),
-                    new LayoutOption ("pause", Catalog.GetString ("Pause playback")),
-                    new LayoutOption ("stop", Catalog.GetString ("Completely stop playback")),
-                    new LayoutOption ("stop-when-finished", Catalog.GetString (
-                        "Enable or disable playback stopping after the currently playing track (value should be either 'true' or 'false')")),
-                    new LayoutOption ("set-volume=LEVEL", Catalog.GetString ("Set the playback volume (0-100)")),
-                    new LayoutOption ("set-position=POS", Catalog.GetString ("Seek to a specific point (seconds, float)"))
-                ),
-                
-                new LayoutGroup ("query-player", Catalog.GetString ("Player Engine Query Options"),
-                    new LayoutOption ("query-current-state", Catalog.GetString ("Current player state")),
-                    new LayoutOption ("query-last-state", Catalog.GetString ("Last player state")),
-                    new LayoutOption ("query-can-pause", Catalog.GetString ("Query whether the player can be paused")),
-                    new LayoutOption ("query-can-seek", Catalog.GetString ("Query whether the player can seek")),
-                    new LayoutOption ("query-volume", Catalog.GetString ("Player volume")),
-                    new LayoutOption ("query-position", Catalog.GetString ("Player position in currently playing track"))
-                ),
-                
-                new LayoutGroup ("query-track", Catalog.GetString ("Playing Track Metadata Query Options"),
-                    new LayoutOption ("query-uri", Catalog.GetString ("URI")),
-                    new LayoutOption ("query-artist", Catalog.GetString ("Artist Name")),
-                    new LayoutOption ("query-album", Catalog.GetString ("Album Title")),
-                    new LayoutOption ("query-title", Catalog.GetString ("Track Title")),
-                    new LayoutOption ("query-duration", Catalog.GetString ("Duration")),
-                    new LayoutOption ("query-track-number", Catalog.GetString ("Track Number")),
-                    new LayoutOption ("query-track-count", Catalog.GetString ("Track Count")),
-                    new LayoutOption ("query-disc", Catalog.GetString ("Disc Number")),
-                    new LayoutOption ("query-year", Catalog.GetString ("Year")),
-                    new LayoutOption ("query-rating", Catalog.GetString ("Rating"))
-                ),
-                
-                new LayoutGroup ("ui", Catalog.GetString ("User Interface Options"),
-                    new LayoutOption ("show|--present", Catalog.GetString ("Present the user interface on the active workspace")),
-                    new LayoutOption ("hide", Catalog.GetString ("Hide the user interface")),
-                    new LayoutOption ("no-present", Catalog.GetString ("Do not present the user interface, regardless of any other options"))
-                ),
-                
-                new LayoutGroup ("debugging", Catalog.GetString ("Debugging and Development Options"), 
-                    new LayoutOption ("debug", Catalog.GetString ("Enable general debugging features")),
-                    new LayoutOption ("debug-sql", Catalog.GetString ("Enable debugging output of SQL queries")),
-                    new LayoutOption ("debug-addins", Catalog.GetString ("Enable debugging output of Mono.Addins")),
-                    new LayoutOption ("db=FILE", Catalog.GetString ("Specify an alternate database to use")),
-                    new LayoutOption ("uninstalled", Catalog.GetString ("Optimize instance for running uninstalled; " + 
-                        "most notably, this will create an alternate Mono.Addins database in the working directory")),
-                    new LayoutOption ("disable-dbus", Catalog.GetString ("Disable DBus support completely")),
-                    new LayoutOption ("no-gtkrc", String.Format (Catalog.GetString (
-                        "Skip loading a custom gtkrc file ({0}) if it exists"), 
-                        user_gtkrc.Replace (Environment.GetFolderPath (Environment.SpecialFolder.Personal), "~")))
-                )
-            );
-            
-            if (ApplicationContext.CommandLine.Contains ("help-all")) {
-                Console.WriteLine (commands);
-                return;
-            }
-            
-            List<string> errors = null;
-            
-            foreach (KeyValuePair<string, string> argument in ApplicationContext.CommandLine.Arguments) {
-                switch (argument.Key) {
-                    case "help": Console.WriteLine (commands.ToString ("help")); break;
-                    case "help-debug": Console.WriteLine (commands.ToString ("debugging")); break;
-                    case "help-query-track": Console.WriteLine (commands.ToString ("query-track")); break;
-                    case "help-query-player": Console.WriteLine (commands.ToString ("query-player")); break;
-                    case "help-ui": Console.WriteLine (commands.ToString ("ui")); break;
-                    case "help-playback": Console.WriteLine (commands.ToString ("playback")); break;
-                    default:
-                        if (argument.Key.StartsWith ("help")) {
-                            (errors ?? errors = new List<string> ()).Add (argument.Key);
-                        }
-                        break;
-                }
-            }
-            
-            if (errors != null) {
-                Console.WriteLine (commands.LayoutLine (String.Format (Catalog.GetString (
-                    "The following help arguments are invalid: {0}"),
-                    Hyena.Collections.CollectionExtensions.Join (errors, "--", null, ", "))));
-            }
-        }
-        
-        private static void ShowVersion ()
-        {
-            Console.WriteLine ("Banshee {0} ({1}) http://banshee-project.org";, Application.DisplayVersion, Application.Version);
-            Console.WriteLine ("Copyright 2005-{0} Novell, Inc. and Contributors.", DateTime.Now.Year);
-        }
-        
+
         public override string ClientId {
             get { return "nereid"; }
         }

Modified: trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs
==============================================================================
--- trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs	(original)
+++ trunk/banshee/src/Clients/Nereid/Nereid/PlayerInterface.cs	Wed Sep  3 15:28:58 2008
@@ -69,7 +69,7 @@
         private ObjectListSourceContents object_view;
         private Label status_label;
         
-        public PlayerInterface () : base (Catalog.GetString ("Banshee Media Player"))
+        public PlayerInterface () : base (Catalog.GetString ("Banshee Media Player"), "player_window", 1024, 700)
         {
         }
         
@@ -85,21 +85,6 @@
             Show ();
         }
         
-        protected override void UpdateTitle ()
-        {
-            TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
-            if (track != null) {
-                // Translators: this is the window title when a track is playing
-                //              {0} is the track title, {1} is the artist name
-                Title = String.Format (Catalog.GetString ("{0} by {1}"), 
-                    track.DisplayTrackTitle, track.DisplayArtistName);
-            } else {
-                Title = Catalog.GetString ("Banshee Media Player");
-            }
-            
-            OnTitleChanged ();
-        }
-        
 #region System Overrides 
         
         public override void Dispose ()
@@ -232,15 +217,13 @@
         
 #region Events and Logic Setup
         
-        private void ConnectEvents ()
+        protected override void ConnectEvents ()
         {
+            base.ConnectEvents ();
+
             // Service events
             ServiceManager.SourceManager.ActiveSourceChanged += OnActiveSourceChanged;
             ServiceManager.SourceManager.SourceUpdated += OnSourceUpdated;
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
-                PlayerEvent.StartOfStream |
-                PlayerEvent.TrackInfoUpdated |
-                PlayerEvent.EndOfStream);
             
             ActionService.TrackActions ["SearchForSameArtistAction"].Activated += OnProgrammaticSearch;
             ActionService.TrackActions ["SearchForSameAlbumAction"].Activated += OnProgrammaticSearch;
@@ -398,12 +381,7 @@
                 view_container.Title = args.Source.Name;
             }
         }
-        
-        private void OnPlayerEvent (PlayerEventArgs args) 
-        {
-            UpdateTitle ();
-        }
-        
+
 #endregion
 
 #region UI Event Handlers
@@ -418,40 +396,10 @@
             source.FilterQuery = view_container.SearchEntry.Query;
         }
         
-        private void OnToolbarExposeEvent (object o, ExposeEventArgs args)
-        {
-            Toolbar toolbar = (Toolbar)o;
-
-            // This forces the toolbar to look like it's just a regular part
-            // of the window since the stock toolbar look makes Banshee look ugly.
-            Style.ApplyDefaultBackground (toolbar.GdkWindow, true, State, 
-                args.Event.Area, toolbar.Allocation.X, toolbar.Allocation.Y, 
-                toolbar.Allocation.Width, toolbar.Allocation.Height);
-
-            // Manually expose all the toolbar's children
-            foreach (Widget child in toolbar.Children) {
-                toolbar.PropagateExpose (child, args.Event);
-            }
-        }
-        
 #endregion
 
 #region Implement Interfaces
 
-        // IHasTrackSelection
-        /*public IEnumerable<TrackInfo> GetSelectedTracks ()
-        {
-            return new ModelSelection<TrackInfo> (composite_view.TrackModel, composite_view.TrackView.Selection);
-        }
-
-        public Hyena.Collections.SelectionProxy TrackSelectionProxy {
-            get { return composite_view.TrackView.SelectionProxy; }
-        }
-
-        public DatabaseTrackListModel TrackModel {
-            get { return composite_view.TrackModel as DatabaseTrackListModel; }
-        }*/
-
         // IHasSourceView
         public Source HighlightedSource {
             get { return source_view.HighlightedSource; }

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	Wed Sep  3 15:28:58 2008
@@ -42,7 +42,7 @@
 {
     public class DatabaseAlbumListModel : DatabaseFilterListModel<DatabaseAlbumInfo, AlbumInfo>
     {
-        public DatabaseAlbumListModel ( Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
+        public DatabaseAlbumListModel (Banshee.Sources.DatabaseSource source, DatabaseTrackListModel trackModel, BansheeDbConnection connection, string uuid) 
             : base (Banshee.Query.BansheeQuery.AlbumField.Name, Banshee.Query.BansheeQuery.AlbumField.Label,
                     source, trackModel, connection, DatabaseAlbumInfo.Provider, new AlbumInfo (null), uuid)
         {

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	Wed Sep  3 15:28:58 2008
@@ -314,6 +314,11 @@
             return (int) cache.IndexOf (track as DatabaseTrackInfo);
         }
 
+        public int IndexOfFirst (TrackInfo track)
+        {
+            return IndexOf (cache.GetSingle ("AND MetadataHash = ? ORDER BY OrderID", track.MetadataHash));
+        }
+
         private DateTime random_began_at = DateTime.MinValue;
         private DateTime last_random = DateTime.MinValue;
         private static string random_fragment = "AND (LastPlayedStamp < ? OR LastPlayedStamp IS NULL) AND (LastSkippedStamp < ? OR LastSkippedStamp IS NULL) ORDER BY RANDOM()";

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Sources/Source.cs	Wed Sep  3 15:28:58 2008
@@ -549,7 +549,7 @@
             get { return duration_status_formatters.Count; }
         }
         
-        protected virtual int CurrentStatusFormat {
+        public virtual int CurrentStatusFormat {
             get { return ConfigurationClient.Get<int> (String.Format ("sources.{0}", ConfigurationId), "status_format", 0); }
             set { ConfigurationClient.Set<int> (String.Format ("sources.{0}", ConfigurationId), "status_format", value); }
         }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs	Wed Sep  3 15:28:58 2008
@@ -30,12 +30,16 @@
 using Gtk;
 using Cairo;
 
+using Hyena.Gui;
 using Hyena.Data.Gui;
+using Hyena.Gui.Theming;
 
 namespace Banshee.Collection.Gui
 {
-    public class ColumnCellTrack : ColumnCell
+    public class ColumnCellTrack : ColumnCell, ITextCell
     {
+        private Pango.Weight font_weight = Pango.Weight.Normal;
+
         public ColumnCellTrack () : base (null, true)
         {
         }
@@ -61,26 +65,31 @@
             }
             
             TrackInfo track = (TrackInfo)BoundObject;
-            
-            Pango.Layout layout = context.Layout;
-            
-            int x = 5, y = 0;
-            int lw, lh;
-            
-            layout.Width = (int)((cellWidth - 2 * x) * Pango.Scale.PangoScale);
-            layout.Ellipsize = Pango.EllipsizeMode.End;
-            layout.FontDescription = context.Widget.PangoContext.FontDescription.Copy ();
-            layout.SetMarkup (String.Format ("<b>{0}</b>\n<small><i>{1}</i></small>", 
+
+            context.Layout.Width = (int)((cellWidth - 8) * Pango.Scale.PangoScale);
+            context.Layout.Ellipsize = Pango.EllipsizeMode.End;
+            //context.Layout.FontDescription = context.Widget.PangoContext.FontDescription.Copy ();
+            context.Layout.FontDescription.Weight = font_weight;
+            context.Layout.SetMarkup (String.Format ("<b>{0}</b>\n<small><i>{1}</i></small>", 
                 GLib.Markup.EscapeText (track.DisplayTrackTitle), 
                 GLib.Markup.EscapeText (track.DisplayArtistName)));
+
+            int text_width;
+            int text_height;
+            context.Layout.GetPixelSize (out text_width, out text_height);
+            
+            context.Context.MoveTo (4, ((int)cellHeight - text_height) / 2);
+            Cairo.Color color = context.Theme.Colors.GetWidgetColor (
+                context.TextAsForeground ? GtkColorClass.Foreground : GtkColorClass.Text, state);
+            color.A = (!context.Sensitive) ? 0.3 : 1.0;
+            context.Context.Color = color;
             
-            layout.GetPixelSize (out lw, out lh);
-            
-            y = (int)((cellHeight - lh) / 2);
-            
-            Style.PaintLayout (context.Widget.Style, context.Drawable, state, true, 
-                context.Area, context.Widget, "text",
-                context.Area.X + x, context.Area.Y + y, layout);
+            PangoCairoHelper.ShowLayout (context.Context, context.Layout);
+        }
+
+        public Pango.Weight FontWeight {
+            get { return font_weight; }
+            set { font_weight = value; }
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TerseTrackListView.cs	Wed Sep  3 15:28:58 2008
@@ -37,22 +37,21 @@
 
 namespace Banshee.Collection.Gui
 {
-    public class TerseTrackListView : ListView<TrackInfo>
+    public class TerseTrackListView : BaseTrackListView
     {
         private ColumnController column_controller;
         
         public TerseTrackListView () : base ()
         {
-            ColumnCellTrack renderer = new ColumnCellTrack ();
-        
             column_controller = new ColumnController ();
+
+            ColumnCellTrack renderer = new ColumnCellTrack ();
             column_controller.Add (new Column ("Track", renderer, 1.0));
             
             ColumnController = column_controller;
             
             RowHeightProvider = renderer.ComputeRowHeight;
             HeaderVisible = false;
-            RulesHint = true;
         }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackFilterListView.cs	Wed Sep  3 15:28:58 2008
@@ -47,11 +47,15 @@
             column_controller = new ColumnController ();
 
             ForceDragSourceSet = true;
+            HeaderVisible = false;
             
-            RowActivated += delegate {
-                ServiceManager.PlaybackController.NextSource = (ServiceManager.SourceManager.ActiveSource as Banshee.Sources.ITrackModelSource);
-                ServiceManager.PlaybackController.Next ();
-            };
+            RowActivated += OnRowActivated;
+        }
+
+        protected virtual void OnRowActivated (object o, EventArgs args)
+        {
+            ServiceManager.PlaybackController.NextSource = (ServiceManager.SourceManager.ActiveSource as Banshee.Sources.ITrackModelSource);
+            ServiceManager.PlaybackController.Next ();
         }
 
         // TODO add context menu for artists/albums...probably need a Banshee.Gui/ArtistActions.cs file.  Should

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs	Wed Sep  3 15:28:58 2008
@@ -43,39 +43,13 @@
 
 namespace Banshee.Collection.Gui
 {
-    public class TrackListView : ListView<TrackInfo>
+    public class TrackListView : BaseTrackListView
     {
         private ColumnController default_column_controller;
         
         public TrackListView () : base ()
         {
             default_column_controller = new DefaultColumnController ();
-
-            RulesHint = true;
-            RowSensitivePropertyName = "CanPlay";
-            RowBoldPropertyName = "IsPlaying";
-            
-            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, PlayerEvent.StateChange);
-            
-            ForceDragSourceSet = true;
-            Reorderable = true;
-            
-            RowActivated += delegate (object o, RowActivatedArgs<TrackInfo> args) {
-                ITrackModelSource source = ServiceManager.SourceManager.ActiveSource as ITrackModelSource;
-                if (source != null && source.TrackModel == Model) {
-                    ServiceManager.PlaybackController.Source = source;
-                    ServiceManager.PlayerEngine.OpenPlay (args.RowValue);
-                }
-            };
-        }
-        
-        protected override bool OnKeyPressEvent (Gdk.EventKey press)
-        {
-            // Have o act the same as enter - activate the selection
-            if (GtkUtilities.NoImportantModifiersAreSet () && press.Key == Gdk.Key.o && ActivateSelection ()) {
-                return true;
-            }
-            return base.OnKeyPressEvent (press);
         }
         
         public override void SetModel (IListModel<TrackInfo> value, double vpos)
@@ -113,59 +87,5 @@
             
             base.SetModel (value, vpos);
         }
-
-        protected override bool OnPopupMenu ()
-        {
-            ServiceManager.Get<InterfaceActionService> ().TrackActions["TrackContextMenuAction"].Activate ();
-            return true;
-        }
-        
-        private void OnPlayerEvent (PlayerEventArgs args)
-        {
-            QueueDraw ();
-        }
-        
-#region Drag and Drop
-
-        protected override void OnDragSourceSet ()
-        {
-            base.OnDragSourceSet ();
-            Drag.SourceSetIconName (this, "audio-x-generic");
-        }
-        
-        protected override bool OnDragDrop (Gdk.DragContext context, int x, int y, uint time_)
-        {
-            y = TranslateToListY (y);
-            if (Gtk.Drag.GetSourceWidget (context) == this) {
-                PlaylistSource playlist = ServiceManager.SourceManager.ActiveSource as PlaylistSource;
-                if (playlist != null) {
-                    //Gtk.Drag.
-                    int row = GetRowAtY (y);
-                    if (row != GetRowAtY (y + RowHeight / 2)) {
-                        row += 1;
-                    }
-                    
-                    if (playlist.TrackModel.Selection.Contains (row)) {
-                        // can't drop within the selection
-                        return false;
-                    }
-                    
-                    playlist.ReorderSelectedTracks (row);
-                    return true;
-                }
-            }
-            
-            return false;
-        }
-
-        protected override void OnDragDataGet (Gdk.DragContext context, SelectionData selection_data, uint info, uint time)
-        {
-            if (info != (int)ListViewDragDropTarget.TargetType.ModelSelection || Selection.Count <= 0) {
-                return;
-            }
-        }
-
-#endregion
-
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/BansheeDialog.cs	Wed Sep  3 15:28:58 2008
@@ -99,7 +99,11 @@
             button.CanDefault = true;
             button.UseStock = isStock;
             button.Show ();
+            AddButton (button, response, isDefault);
+        }
 
+        public void AddButton (Button button, ResponseType response, bool isDefault)
+        {
             AddActionWidget (button, response);
 
             if (isDefault) {

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/TrackInfoDisplay.cs	Wed Sep  3 15:28:58 2008
@@ -65,12 +65,12 @@
         
         private Pixbuf missing_audio_pixbuf;
         protected Pixbuf MissingAudioPixbuf {
-            get { return missing_audio_pixbuf; }
+            get { return missing_audio_pixbuf ?? missing_audio_pixbuf = IconThemeUtils.LoadIcon (MissingIconSizeRequest, "audio-x-generic"); }
         }
         
         private Pixbuf missing_video_pixbuf;
         protected Pixbuf MissingVideoPixbuf {
-            get { return missing_video_pixbuf; }
+            get { return missing_video_pixbuf ?? missing_video_pixbuf = IconThemeUtils.LoadIcon (MissingIconSizeRequest, "video-x-generic"); }
         }
         
         private Cairo.Color background_color;
@@ -250,7 +250,7 @@
             
             if (same_artist_album) {
                 RenderTrackInfo (cr, incoming_track, same_track, true);
-            } 
+            }
             
             if (stage.Actor.Percent <= 0.5) {
                 // Fade out old text
@@ -356,17 +356,7 @@
             Gdk.Pixbuf pixbuf = artwork_manager.LookupScale (track.ArtworkId, ArtworkSizeRequest);
 
             if (pixbuf == null) {
-                if ((track.MediaAttributes & TrackMediaAttributes.VideoStream) != 0) {
-                    if (missing_video_pixbuf == null) {
-                        missing_video_pixbuf = IconThemeUtils.LoadIcon (MissingIconSizeRequest, "video-x-generic");
-                    }
-                    incoming_pixbuf = missing_video_pixbuf;
-                } else {
-                    if (missing_audio_pixbuf == null) {
-                        missing_audio_pixbuf = IconThemeUtils.LoadIcon (MissingIconSizeRequest, "audio-x-generic");
-                    }
-                    incoming_pixbuf = missing_audio_pixbuf;
-                }
+                LoadMissingPixbuf ((track.MediaAttributes & TrackMediaAttributes.VideoStream) != 0);
             } else {
                 incoming_pixbuf = pixbuf;
             }
@@ -375,6 +365,11 @@
                 current_pixbuf = incoming_pixbuf;
             }
         }
+
+        private void LoadMissingPixbuf (bool is_video)
+        {
+            incoming_pixbuf = is_video ? MissingVideoPixbuf : MissingAudioPixbuf;
+        }
         
         private double last_fps = 0.0;
         

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/BaseClientWindow.cs	Wed Sep  3 15:28:58 2008
@@ -28,14 +28,19 @@
 
 using System;
 using Gtk;
+using Mono.Unix;
 
 using Banshee.ServiceStack;
+using Banshee.MediaEngine;
+using Banshee.Collection;
 using Banshee.Configuration;
 
 namespace Banshee.Gui
 {
     public abstract class BaseClientWindow : Window
     {
+        private PersistentWindowController window_controller;
+
         private GtkElementsService elements_service;
         protected GtkElementsService ElementsService {
             get { return elements_service; }
@@ -48,13 +53,15 @@
         
         public event EventHandler TitleChanged;
     
-        public BaseClientWindow (string title) : base (title)
+        public BaseClientWindow (string title, string configNameSpace, int defaultWidth, int defaultHeight) : base (title)
         {
             elements_service = ServiceManager.Get<GtkElementsService> ("GtkElementsService");
             action_service = ServiceManager.Get<InterfaceActionService> ("InterfaceActionService");
             
             ConfigureWindow ();
-            ResizeMoveWindow ();
+
+            window_controller = new PersistentWindowController (this, configNameSpace, defaultWidth, defaultHeight, WindowPersistOptions.All);
+            window_controller.Restore ();
             
             elements_service.PrimaryWindow = this;
             
@@ -63,78 +70,43 @@
             InitializeWindow ();
         }
 
-        public abstract Box ViewContainer { get; }
+        public virtual Box ViewContainer { get { return null; } }
         
         public void ToggleVisibility ()
         {
             if (Visible) {
-                SaveWindowSizePosition ();
+                window_controller.Save ();
                 Visible = false;
             } else {
-                RestoreWindowSizePosition ();
+                window_controller.Restore ();
                 Present ();
             }
         }
         
-        private int x, y, w, h;
-        private bool maximized;
-        
-        private void SaveWindowSizePosition ()
+        private void InitializeWindow ()
         {
-            maximized = ((GdkWindow.State & Gdk.WindowState.Maximized) > 0);
-
-            if (!maximized) {
-                GetPosition (out x, out y);
-                GetSize (out w, out h);
-            }
+            Initialize ();
         }
+        
+        protected abstract void Initialize ();
 
-        private void RestoreWindowSizePosition () 
+        protected virtual void ConnectEvents ()
         {
-            if (maximized) {
-                Maximize ();
-            } else {
-                Resize (w, h);
-                Move (x, y);
-            }
+            ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, 
+                PlayerEvent.StartOfStream |
+                PlayerEvent.TrackInfoUpdated |
+                PlayerEvent.EndOfStream);
         }
-        
-        private void InitializeWindow ()
+
+        private void OnPlayerEvent (PlayerEventArgs args) 
         {
-            Initialize ();
+            UpdateTitle ();
         }
-        
-        protected abstract void Initialize ();
     
         protected virtual void ConfigureWindow ()
         {
-            WindowPosition = WindowPosition.Center;
         }
     
-        protected virtual void ResizeMoveWindow ()
-        {
-            int x = XPosSchema.Get ();
-            int y = YPosSchema.Get (); 
-            int width = WidthSchema.Get ();
-            int height = HeightSchema.Get ();
-           
-            if(width != 0 && height != 0) {
-                Resize (width, height);
-            }
-
-            if (x == 0 && y == 0) {
-                SetPosition (WindowPosition.Center);
-            } else {
-                Move (x, y);
-            }
-            
-            if (MaximizedSchema.Get ()) {
-                Maximize ();
-            } else {
-                Unmaximize ();
-            }
-        }
-        
         protected override bool OnDeleteEvent (Gdk.Event evnt)
         {
              if (ElementsService.PrimaryWindowClose != null) {
@@ -147,32 +119,13 @@
             return base.OnDeleteEvent (evnt);
         }
 
-        protected override bool OnConfigureEvent (Gdk.EventConfigure evnt)
-        {
-            int x, y, width, height;
-
-            if ((GdkWindow.State & Gdk.WindowState.Maximized) != 0) {
-                return base.OnConfigureEvent (evnt);
-            }
-            
-            GetPosition (out x, out y);
-            GetSize (out width, out height);
-           
-            XPosSchema.Set (x);
-            YPosSchema.Set (y);
-            WidthSchema.Set (width);
-            HeightSchema.Set (height);
-            
-            return base.OnConfigureEvent (evnt);
-        }
-        
         protected override bool OnWindowStateEvent (Gdk.EventWindowState evnt)
         {
             ToggleAction fullscreen_action = (ToggleAction) ServiceManager.Get<InterfaceActionService> ().ViewActions["FullScreenAction"];
             fullscreen_action.Active = (evnt.NewWindowState & Gdk.WindowState.Fullscreen) != 0;
             
             if ((evnt.NewWindowState & Gdk.WindowState.Withdrawn) == 0) {
-                MaximizedSchema.Set ((evnt.NewWindowState & Gdk.WindowState.Maximized) != 0);
+                window_controller.Save ();
             }
             
             return base.OnWindowStateEvent (evnt);
@@ -186,41 +139,35 @@
             }
         }
         
-        protected abstract void UpdateTitle ();
-        
-        public static readonly SchemaEntry<int> WidthSchema = new SchemaEntry<int>(
-            "player_window", "width",
-            1024,
-            "Window Width",
-            "Width of the main interface window."
-        );
-
-        public static readonly SchemaEntry<int> HeightSchema = new SchemaEntry<int>(
-            "player_window", "height",
-            700,
-            "Window Height",
-            "Height of the main interface window."
-        );
-
-        public static readonly SchemaEntry<int> XPosSchema = new SchemaEntry<int>(
-            "player_window", "x_pos",
-            0,
-            "Window Position X",
-            "Pixel position of Main Player Window on the X Axis"
-        );
-
-        public static readonly SchemaEntry<int> YPosSchema = new SchemaEntry<int>(
-            "player_window", "y_pos",
-            0,
-            "Window Position Y",
-            "Pixel position of Main Player Window on the Y Axis"
-        );
-
-        public static readonly SchemaEntry<bool> MaximizedSchema = new SchemaEntry<bool>(
-            "player_window", "maximized",
-            false,
-            "Window Maximized",
-            "True if main window is to be maximized, false if it is not."
-        );
+        protected virtual void UpdateTitle ()
+        {
+            TrackInfo track = ServiceManager.PlayerEngine.CurrentTrack;
+            if (track != null) {
+                // Translators: this is the window title when a track is playing
+                //              {0} is the track title, {1} is the artist name
+                Title = String.Format (Catalog.GetString ("{0} by {1}"), 
+                    track.DisplayTrackTitle, track.DisplayArtistName);
+            } else {
+                Title = Catalog.GetString ("Banshee Media Player");
+            }
+            
+            OnTitleChanged ();
+        }
+
+        protected void OnToolbarExposeEvent (object o, ExposeEventArgs args)
+        {
+            Toolbar toolbar = (Toolbar)o;
+
+            // This forces the toolbar to look like it's just a regular part
+            // of the window since the stock toolbar look makes Banshee look ugly.
+            Style.ApplyDefaultBackground (toolbar.GdkWindow, true, State, 
+                args.Event.Area, toolbar.Allocation.X, toolbar.Allocation.Y, 
+                toolbar.Allocation.Width, toolbar.Allocation.Height);
+
+            // Manually expose all the toolbar's children
+            foreach (Widget child in toolbar.Children) {
+                toolbar.PropagateExpose (child, args.Event);
+            }
+        }
     }
 }

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs	Wed Sep  3 15:28:58 2008
@@ -27,8 +27,15 @@
 //
 
 using System;
+using System.IO;
+using System.Diagnostics;
+using System.Reflection;
+using System.Collections.Generic;
+using Mono.Unix;
 
 using Hyena;
+using Hyena.CommandLine;
+
 using Banshee.Base;
 using Banshee.Database;
 using Banshee.ServiceStack;
@@ -38,15 +45,170 @@
 {
     public abstract class GtkBaseClient : Client
     {
-        private static Type client_type; 
+        private static Type client_type;
+
+        private static string user_gtkrc = Path.Combine (Paths.ApplicationData, "gtkrc"); 
+        public static void Startup<T> (string [] args) where T : GtkBaseClient
+        {
+            if (CheckHelpVersion ()) {
+                return;
+            }
+        
+            // Check for single instance
+            DBusConnection.Connect ();
+            if (DBusConnection.InstanceAlreadyRunning) {
+                // Try running our friend Halie, the DBus command line client
+                AppDomain.CurrentDomain.ExecuteAssembly (Path.Combine (Path.GetDirectoryName (
+                    Assembly.GetEntryAssembly ().Location), "Halie.exe"));
+                Gdk.Global.InitCheck (ref args);
+                Gdk.Global.NotifyStartupComplete ();
+                return;
+            }
+                    
+            Hyena.Log.InformationFormat ("Running Banshee {0}", Application.Version);
+            
+            // This could go into GtkBaseClient, but it's probably something we
+            // should really only support at each client level
+            if (File.Exists (user_gtkrc) && !ApplicationContext.CommandLine.Contains ("no-gtkrc")) {
+                Gtk.Rc.AddDefaultFile (user_gtkrc);
+            } 
+            
+            // Ugly hack to avoid stupid themes that set this to 0, causing a huge
+            // bug when constructing the "add to playlist" popup menu (BGO #524706)
+            Gtk.Rc.ParseString ("gtk-menu-popup-delay = 225");
+
+            // Boot the client
+            Banshee.Gui.GtkBaseClient.Startup<T> ();
+        }
+
+        private static bool CheckHelpVersion ()
+        {
+            if (ApplicationContext.CommandLine.ContainsStart ("help")) {
+                ShowHelp ();
+                return true;
+            } else if (ApplicationContext.CommandLine.Contains ("version")) {
+                ShowVersion ();
+                return true;
+            }
+            
+            return false;
+        }
+        
+        private static void ShowHelp ()
+        {
+            Console.WriteLine ("Usage: {0} [options...] [files|URIs...]", "banshee-1");
+            Console.WriteLine ();
+            
+            Layout commands = new Layout (
+                new LayoutGroup ("help", Catalog.GetString ("Help Options"),
+                    new LayoutOption ("help", Catalog.GetString ("Show this help")),
+                    new LayoutOption ("help-playback", Catalog.GetString ("Show options for controlling playback")),
+                    new LayoutOption ("help-query-track", Catalog.GetString ("Show options for querying the playing track")),
+                    new LayoutOption ("help-query-player", Catalog.GetString ("Show options for querying the playing engine")),
+                    new LayoutOption ("help-ui", Catalog.GetString ("Show options for the user interface")),
+                    new LayoutOption ("help-debug", Catalog.GetString ("Show options for developers and debugging")),
+                    new LayoutOption ("help-all", Catalog.GetString ("Show all option groups")),
+                    new LayoutOption ("version", Catalog.GetString ("Show version information"))
+                ),
+                
+                new LayoutGroup ("playback", Catalog.GetString ("Playback Control Options"),
+                    new LayoutOption ("next", Catalog.GetString ("Play the next track, optionally restarting if the 'restart' value is set")),
+                    new LayoutOption ("previous", Catalog.GetString ("Play the previous track, optionally restarting if the 'restart value is set")),
+                    new LayoutOption ("play-enqueued", Catalog.GetString ("Automatically start playing any tracks enqueued on the command line")),
+                    new LayoutOption ("play", Catalog.GetString ("Start playback")),
+                    new LayoutOption ("pause", Catalog.GetString ("Pause playback")),
+                    new LayoutOption ("stop", Catalog.GetString ("Completely stop playback")),
+                    new LayoutOption ("stop-when-finished", Catalog.GetString (
+                        "Enable or disable playback stopping after the currently playing track (value should be either 'true' or 'false')")),
+                    new LayoutOption ("set-volume=LEVEL", Catalog.GetString ("Set the playback volume (0-100)")),
+                    new LayoutOption ("set-position=POS", Catalog.GetString ("Seek to a specific point (seconds, float)"))
+                ),
+                
+                new LayoutGroup ("query-player", Catalog.GetString ("Player Engine Query Options"),
+                    new LayoutOption ("query-current-state", Catalog.GetString ("Current player state")),
+                    new LayoutOption ("query-last-state", Catalog.GetString ("Last player state")),
+                    new LayoutOption ("query-can-pause", Catalog.GetString ("Query whether the player can be paused")),
+                    new LayoutOption ("query-can-seek", Catalog.GetString ("Query whether the player can seek")),
+                    new LayoutOption ("query-volume", Catalog.GetString ("Player volume")),
+                    new LayoutOption ("query-position", Catalog.GetString ("Player position in currently playing track"))
+                ),
+                
+                new LayoutGroup ("query-track", Catalog.GetString ("Playing Track Metadata Query Options"),
+                    new LayoutOption ("query-uri", Catalog.GetString ("URI")),
+                    new LayoutOption ("query-artist", Catalog.GetString ("Artist Name")),
+                    new LayoutOption ("query-album", Catalog.GetString ("Album Title")),
+                    new LayoutOption ("query-title", Catalog.GetString ("Track Title")),
+                    new LayoutOption ("query-duration", Catalog.GetString ("Duration")),
+                    new LayoutOption ("query-track-number", Catalog.GetString ("Track Number")),
+                    new LayoutOption ("query-track-count", Catalog.GetString ("Track Count")),
+                    new LayoutOption ("query-disc", Catalog.GetString ("Disc Number")),
+                    new LayoutOption ("query-year", Catalog.GetString ("Year")),
+                    new LayoutOption ("query-rating", Catalog.GetString ("Rating"))
+                ),
+                
+                new LayoutGroup ("ui", Catalog.GetString ("User Interface Options"),
+                    new LayoutOption ("show|--present", Catalog.GetString ("Present the user interface on the active workspace")),
+                    new LayoutOption ("hide", Catalog.GetString ("Hide the user interface")),
+                    new LayoutOption ("no-present", Catalog.GetString ("Do not present the user interface, regardless of any other options"))
+                ),
+                
+                new LayoutGroup ("debugging", Catalog.GetString ("Debugging and Development Options"), 
+                    new LayoutOption ("debug", Catalog.GetString ("Enable general debugging features")),
+                    new LayoutOption ("debug-sql", Catalog.GetString ("Enable debugging output of SQL queries")),
+                    new LayoutOption ("debug-addins", Catalog.GetString ("Enable debugging output of Mono.Addins")),
+                    new LayoutOption ("db=FILE", Catalog.GetString ("Specify an alternate database to use")),
+                    new LayoutOption ("uninstalled", Catalog.GetString ("Optimize instance for running uninstalled; " + 
+                        "most notably, this will create an alternate Mono.Addins database in the working directory")),
+                    new LayoutOption ("disable-dbus", Catalog.GetString ("Disable DBus support completely")),
+                    new LayoutOption ("no-gtkrc", String.Format (Catalog.GetString (
+                        "Skip loading a custom gtkrc file ({0}) if it exists"), 
+                        user_gtkrc.Replace (Environment.GetFolderPath (Environment.SpecialFolder.Personal), "~")))
+                )
+            );
+            
+            if (ApplicationContext.CommandLine.Contains ("help-all")) {
+                Console.WriteLine (commands);
+                return;
+            }
+            
+            List<string> errors = null;
+            
+            foreach (KeyValuePair<string, string> argument in ApplicationContext.CommandLine.Arguments) {
+                switch (argument.Key) {
+                    case "help": Console.WriteLine (commands.ToString ("help")); break;
+                    case "help-debug": Console.WriteLine (commands.ToString ("debugging")); break;
+                    case "help-query-track": Console.WriteLine (commands.ToString ("query-track")); break;
+                    case "help-query-player": Console.WriteLine (commands.ToString ("query-player")); break;
+                    case "help-ui": Console.WriteLine (commands.ToString ("ui")); break;
+                    case "help-playback": Console.WriteLine (commands.ToString ("playback")); break;
+                    default:
+                        if (argument.Key.StartsWith ("help")) {
+                            (errors ?? errors = new List<string> ()).Add (argument.Key);
+                        }
+                        break;
+                }
+            }
+            
+            if (errors != null) {
+                Console.WriteLine (commands.LayoutLine (String.Format (Catalog.GetString (
+                    "The following help arguments are invalid: {0}"),
+                    Hyena.Collections.CollectionExtensions.Join (errors, "--", null, ", "))));
+            }
+        }
+        
+        private static void ShowVersion ()
+        {
+            Console.WriteLine ("Banshee {0} ({1}) http://banshee-project.org";, Application.DisplayVersion, Application.Version);
+            Console.WriteLine ("Copyright 2005-{0} Novell, Inc. and Contributors.", DateTime.Now.Year);
+        }
 
-        public static void Entry<T> () where T : GtkBaseClient
+        public static void Startup<T> () where T : GtkBaseClient
         {
             if (client_type != null) {
                 throw new ApplicationException ("Only a single GtkBaseClient can be initialized through Entry<T>");
             }
             
-            client_type = typeof (T);            
+            client_type = typeof (T);
             Hyena.Gui.CleanRoomStartup.Startup (Startup);
         }
         

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	Wed Sep  3 15:28:58 2008
@@ -120,6 +120,8 @@
     <File name="Banshee.Gui.Widgets/ClassicTrackInfoDisplay.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Library.Gui/PhotoFolderImportSource.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Gui.Widgets/LargeTrackInfoDisplay.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection.Gui/BaseTrackListView.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Gui/PersistentWindowController.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Gui.TrackEditor/TrackEditorDialog.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Gui.TrackEditor/ITrackEditorPage.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Gui.TrackEditor/BasicTrackDetailsPage.cs" subtype="Code" buildaction="Compile" />
@@ -173,4 +175,4 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
-</Project>
\ No newline at end of file
+</Project>

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am	Wed Sep  3 15:28:58 2008
@@ -11,6 +11,7 @@
 	Banshee.Collection.Gui/ArtistListView.cs \
 	Banshee.Collection.Gui/ArtworkManager.cs \
 	Banshee.Collection.Gui/ArtworkRenderer.cs \
+	Banshee.Collection.Gui/BaseTrackListView.cs \
 	Banshee.Collection.Gui/ColumnCellAlbum.cs \
 	Banshee.Collection.Gui/ColumnCellDateTime.cs \
 	Banshee.Collection.Gui/ColumnCellDuration.cs \
@@ -95,6 +96,7 @@
 	Banshee.Gui/IHasSourceView.cs \
 	Banshee.Gui/InterfaceActionService.cs \
 	Banshee.Gui/PersistentPaneController.cs \
+	Banshee.Gui/PersistentWindowController.cs \
 	Banshee.Gui/PlaybackActions.cs \
 	Banshee.Gui/PlaybackRepeatActions.cs \
 	Banshee.Gui/PlaybackShuffleActions.cs \

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs	Wed Sep  3 15:28:58 2008
@@ -35,7 +35,7 @@
 
 namespace Hyena.Data.Gui
 {
-    public class ColumnCellText : ColumnCell, ISizeRequestCell
+    public class ColumnCellText : ColumnCell, ISizeRequestCell, ITextCell
     {
         public delegate string DataHandler ();
     
@@ -68,13 +68,9 @@
             context.Context.MoveTo (4, ((int)cellHeight - text_height) / 2);
             Cairo.Color color = context.Theme.Colors.GetWidgetColor (
                 context.TextAsForeground ? GtkColorClass.Foreground : GtkColorClass.Text, state);
-            if (!context.Sensitive) {
-                color.A = 0.3;
-            } else {
-                color.A = opacity;
-            }
-            
+            color.A = (!context.Sensitive) ? 0.3 : opacity;
             context.Context.Color = color;
+
             PangoCairoHelper.ShowLayout (context.Context, context.Layout);
         }
         

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs	Wed Sep  3 15:28:58 2008
@@ -329,7 +329,7 @@
             cell.BindListItem (item);
             ColumnCellDataProvider (cell, item);
             
-            ColumnCellText text_cell = cell as ColumnCellText;
+            ITextCell text_cell = cell as ITextCell;
             if (text_cell != null) {
                 text_cell.FontWeight = bold ? Pango.Weight.Bold : Pango.Weight.Normal;
             }

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	Wed Sep  3 15:28:58 2008
@@ -85,6 +85,8 @@
     <File name="Hyena.Data.Gui/ListView/ListViewBase.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Gui/GtkWorkarounds.cs" subtype="Code" buildaction="Compile" />
     <File name="Hyena.Gui/Contrast.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena.Widgets/ImageButton.cs" subtype="Code" buildaction="Compile" />
+    <File name="Hyena.Data.Gui/ITextCell.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
@@ -108,4 +110,4 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
-</Project>
\ No newline at end of file
+</Project>

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Makefile.am	Wed Sep  3 15:28:58 2008
@@ -14,6 +14,7 @@
 	Hyena.Data.Gui/IInteractiveCell.cs \
 	Hyena.Data.Gui/IListView.cs \
 	Hyena.Data.Gui/ISizeRequestCell.cs \
+	Hyena.Data.Gui/ITextCell.cs \
 	Hyena.Data.Gui/ListView/ListView.cs \
 	Hyena.Data.Gui/ListView/ListView_DragAndDrop.cs \
 	Hyena.Data.Gui/ListView/ListView_Header.cs \
@@ -70,6 +71,7 @@
 	Hyena.Widgets/AnimatedVBox.cs \
 	Hyena.Widgets/AnimatedWidget.cs \
 	Hyena.Widgets/ComplexMenuItem.cs \
+	Hyena.Widgets/ImageButton.cs \
 	Hyena.Widgets/MenuButton.cs \
 	Hyena.Widgets/MessageBar.cs \
 	Hyena.Widgets/RatingEntry.cs \

Modified: trunk/banshee/src/Makefile.am
==============================================================================
--- trunk/banshee/src/Makefile.am	(original)
+++ trunk/banshee/src/Makefile.am	Wed Sep  3 15:28:58 2008
@@ -1,10 +1,10 @@
 SUBDIRS = \
 	Libraries \
 	Core \
-	Clients \
 	Dap \
 	Extensions \
-	Backends
+	Backends \
+	Clients
 
 EXTRA_DIST = AssemblyInfo.cs.in
 



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