Index: src/Core/Banshee.Base/TrackInfoHeader.cs
===================================================================
--- src/Core/Banshee.Base/TrackInfoHeader.cs	(revision 2210)
+++ src/Core/Banshee.Base/TrackInfoHeader.cs	(working copy)
@@ -40,11 +40,15 @@
         private string title;
         private string more_info_uri;
     
-        private Label artist_album_label;
+        private Label by_label, artist_label, from_label, album_label;
         private LinkLabel title_label;
         private CoverArtThumbnail cover;
         private VBox box;
-        
+        private HBox hbox;
+        private EventBox artist_eventbox,album_eventbox;
+ 
+        private Gdk.Cursor handCursor;
+
         public TrackInfoHeader() : this(true, 36)
         {
         }
@@ -53,11 +57,13 @@
         {
             ConstructWidget(ellipsize, size);
         }
-        
+
         private void ConstructWidget(bool ellipsize, int size)
         {
             Spacing = 8;
-            
+    
+            handCursor = new Gdk.Cursor(Gdk.CursorType.Hand1);
+             
             cover = new CoverArtThumbnail(size);
             cover.NoArtworkPixbuf = Banshee.Base.Branding.DefaultCoverArt;
             PackStart(cover, false, false, 0);
@@ -65,18 +71,58 @@
         
             box = new VBox();
             box.Spacing = 2;
+           
+            hbox = new HBox();
+            hbox.Spacing = 2;
+            
         
-            artist_album_label = ellipsize ? new EllipsizeLabel() : new Label();
-            artist_album_label.Show();
-            artist_album_label.Xalign = 0.0f;
-            artist_album_label.Yalign = 0.5f;
-            artist_album_label.Selectable = true;
+            by_label = new Label();
+            by_label.Show();
+            by_label.Xalign = 0.0f;
+            by_label.Yalign = 0.5f;
+            by_label.Selectable = false;
+
+              
+            artist_eventbox = new EventBox ();
+            artist_eventbox.Show();
+
+            artist_label = new Label();
+            artist_label.Show();
+            artist_label.Xalign = 0.0f;
+            artist_label.Yalign = 0.5f;
+            artist_label.Selectable = false;
+            //artist_eventbox.GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Hand1);
+            artist_eventbox.Add(artist_label);
+            artist_eventbox.ButtonReleaseEvent += new ButtonReleaseEventHandler(artist_label_click);
+            artist_eventbox.EnterNotifyEvent += new EnterNotifyEventHandler(artist_label_over);
+            artist_eventbox.LeaveNotifyEvent += new LeaveNotifyEventHandler(artist_label_out);
             
+            from_label = new Label();
+            from_label.Show();
+            from_label.Xalign = 0.0f;
+            from_label.Yalign = 0.5f;
+            from_label.Selectable = false;
+
+            album_eventbox = new EventBox ();
+            album_eventbox.Show();
+
+            album_label = new Label();
+            album_label.Show();
+            album_label.Xalign = 0.0f;
+            album_label.Yalign = 0.5f;
+            album_label.Selectable = false;
+            album_eventbox.Add(album_label);
+            album_eventbox.ButtonReleaseEvent += new ButtonReleaseEventHandler(album_label_click);
+            album_eventbox.EnterNotifyEvent += new EnterNotifyEventHandler(album_label_over);
+            album_eventbox.LeaveNotifyEvent += new LeaveNotifyEventHandler(album_label_out);
+ 	
+            hbox.PackStart(by_label, false, false, 0);
+            hbox.PackStart(artist_eventbox, false, false, 0);
+            hbox.PackStart(from_label, false, false, 0);
+            hbox.PackStart(album_eventbox, false, false, 0);
+       
             title_label = new LinkLabel();
-            if(ellipsize) {
-                title_label.Ellipsize = Pango.EllipsizeMode.End;
-            }
-            
+            if (ellipsize) title_label.Ellipsize = Pango.EllipsizeMode.End;
             title_label.Show();
             title_label.Xalign = 0.0f;
             title_label.Yalign = 0.5f;
@@ -85,34 +131,68 @@
             title_label.Open = Banshee.Web.Browser.Open;
             
             box.PackStart(title_label, false, false, 0);
-            box.PackStart(artist_album_label, false, false, 0);
+            box.PackStart(hbox, false, false, 0);
             
             PackStart(box, true, true, 0);
+            hbox.ShowAll();
             box.ShowAll();
             Hide();
         }
-        
+
+        public void artist_label_out (object o, LeaveNotifyEventArgs args)
+        {
+          artist_label.Markup = GLib.Markup.EscapeText(artist);
+        }
+
+        public void artist_label_over (object o, EnterNotifyEventArgs args)
+        {
+          artist_eventbox.GdkWindow.Cursor = handCursor;
+          artist_label.Markup = "<span color=\"#0000ff\" underline=\"single\">" + GLib.Markup.EscapeText(artist) + "</span>";
+        }
+
+        public void artist_label_click (object o, ButtonReleaseEventArgs args)
+        {
+          Banshee.Base.InterfaceElements.SearchEntry.Query=artist;
+        }
+
+        public void album_label_out (object o, LeaveNotifyEventArgs args)
+        {
+           album_label.Markup = GLib.Markup.EscapeText(album);
+        }
+
+        public void album_label_over (object o, EnterNotifyEventArgs args)
+        {
+          album_eventbox.GdkWindow.Cursor = handCursor;
+          album_label.Markup = "<span color=\"#0000ff\" underline=\"single\">" + GLib.Markup.EscapeText(album) + "</span>";
+        }
+
+        public void album_label_click (object o, ButtonReleaseEventArgs args)
+        {
+          Banshee.Base.InterfaceElements.SearchEntry.Query=album;
+        }
+
         private void UpdateDisplay()
         {
             Gdk.Color blend = Banshee.Base.Utilities.ColorBlend(
-                artist_album_label.Style.Background(StateType.Normal),
-                artist_album_label.Style.Foreground(StateType.Normal));
+                artist_label.Style.Background(StateType.Normal),
+                artist_label.Style.Foreground(StateType.Normal));
             string hex_blend = String.Format("#{0:x2}{1:x2}{2:x2}", blend.Red, blend.Green, blend.Blue);
                         
-            if(album == null || album == String.Empty) {
-                artist_album_label.Markup = String.Format(
-                    "<span color=\"{0}\">{1}</span>  {2}",
-                    hex_blend, 
-                    Catalog.GetString("by"),
-                    GLib.Markup.EscapeText(artist));
-            } else {
-                artist_album_label.Markup = String.Format(
-                    "<span color=\"{0}\">{1}</span>  {3}  <span color=\"{0}\">{2}</span>  {4}",
-                    hex_blend, 
-                    Catalog.GetString("by"),
-                    Catalog.GetString("from"),
-                    GLib.Markup.EscapeText(artist), 
-                    GLib.Markup.EscapeText(album));
+            by_label.Markup = String.Format(
+                "<span color=\"{0}\">{1}</span>",
+                hex_blend,
+                Catalog.GetString("by")+" ");
+
+            artist_label.Markup = GLib.Markup.EscapeText(artist);
+
+            if (album != null) if (album != String.Empty) 
+            {   
+                from_label.Markup = String.Format(
+                   "<span color=\"{0}\">{1}</span>",
+                   hex_blend,
+                   " " + Catalog.GetString("from") + " ");
+
+                album_label.Markup = GLib.Markup.EscapeText(album);
             }
             
             title_label.Markup = String.Format("<b>{0}</b>", GLib.Markup.EscapeText(title));
@@ -167,7 +247,10 @@
 
         public bool Selectable {
             set {
-                artist_album_label.Selectable = value;
+                by_label.Selectable = value;
+                artist_label.Selectable = value;
+                from_label.Selectable = value;
+                album_label.Selectable = value;
                 title_label.Selectable = value;
             }
         }
@@ -180,5 +263,6 @@
         {
             box.Hide();
         }
+     
     }
 }
