private void Parse() { lock (iLock) { if (!iParsed) { List <KeyValuePair <string, string> > displayList = new List <KeyValuePair <string, string> >(); List <KeyValuePair <string, string> > fullList = new List <KeyValuePair <string, string> >(); if (iItem != null) { string type = GetItemType(iItem); fullList.Add(new KeyValuePair <string, string>("Type", type)); string title = DidlLiteAdapter.Title(iItem); if (title != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Title", title)); fullList.Add(new KeyValuePair <string, string>("Title", title)); } string album = DidlLiteAdapter.Album(iItem); // if parent is a musicAlbum and album is blank, try to get album info from parent if (album == string.Empty && iParent is musicAlbum) { album = DidlLiteAdapter.Album(iParent); } // don't display album field if we are a musicAlbum as it will be same as Title if (album != string.Empty && !(iItem is musicAlbum)) { // only insert album info for display if parent not a musicAlbum if (!(iParent is musicAlbum)) { displayList.Add(new KeyValuePair <string, string>("Album", album)); } fullList.Add(new KeyValuePair <string, string>("Album", album)); } string artist = DidlLiteAdapter.Artist(iItem); string albumArtist = DidlLiteAdapter.AlbumArtist(iItem); string parentArtist = string.Empty; if (iParent != null) { parentArtist = DidlLiteAdapter.Artist(iParent); } // don't display artist field if we are a person, as it will be same as title if (artist != string.Empty && !(iItem is person)) { // only display artist field when: // our parent is not a music album // or we are a music album and album artist field is blank // our parent is a music album but artist field is different from album artist field and different from parent's artist field if (!(iParent is musicAlbum) || (iItem is musicAlbum && albumArtist == string.Empty) || (iParent is musicAlbum && albumArtist != artist && parentArtist != artist)) { displayList.Add(new KeyValuePair <string, string>("Artist", artist)); } fullList.Add(new KeyValuePair <string, string>("Artist", artist)); } if (albumArtist != string.Empty) { // only display albumartist field when: // we are a musicAlbum and album artist is different from artist // or artist field is blank and album artist is not the same as parent's artist field if ((iItem is musicAlbum && albumArtist != artist) || (artist == string.Empty && parentArtist != albumArtist)) { displayList.Add(new KeyValuePair <string, string>("Album Artist", albumArtist)); } fullList.Add(new KeyValuePair <string, string>("Album Artist", albumArtist)); } string count = DidlLiteAdapter.Count(iItem); if (count != string.Empty && count != "0") { displayList.Add(new KeyValuePair <string, string>("Count", count)); fullList.Add(new KeyValuePair <string, string>("Count", count)); } string composer = DidlLiteAdapter.Composer(iItem); if (composer != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Composer", composer)); fullList.Add(new KeyValuePair <string, string>("Composer", composer)); } string genre = DidlLiteAdapter.Genre(iItem); if (genre != string.Empty) { string parentGenre = string.Empty; if (iParent != null) { parentGenre = DidlLiteAdapter.Genre(iParent); } if (parentGenre != genre) { displayList.Add(new KeyValuePair <string, string>("Genre", genre)); } fullList.Add(new KeyValuePair <string, string>("Genre", genre)); } string releaseYear = DidlLiteAdapter.ReleaseYear(iItem); if (releaseYear != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Release Year", releaseYear)); fullList.Add(new KeyValuePair <string, string>("Release Year", releaseYear)); } string originalTrackNumber = DidlLiteAdapter.OriginalTrackNumber(iItem); if (originalTrackNumber != string.Empty) { fullList.Add(new KeyValuePair <string, string>("Original Track No.", originalTrackNumber)); } string conductor = DidlLiteAdapter.Conductor(iItem); if (conductor != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Conductor", conductor)); fullList.Add(new KeyValuePair <string, string>("Conductor", conductor)); } string actor = DidlLiteAdapter.Actor(iItem); if (actor != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Actor", actor)); fullList.Add(new KeyValuePair <string, string>("Actor", actor)); } string director = DidlLiteAdapter.Director(iItem); if (director != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Director", director)); fullList.Add(new KeyValuePair <string, string>("Director", director)); } string publisher = DidlLiteAdapter.Publisher(iItem); if (publisher != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Publisher", publisher)); fullList.Add(new KeyValuePair <string, string>("Publisher", publisher)); } string contributer = DidlLiteAdapter.Contributor(iItem); if (contributer != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Contributor", contributer)); fullList.Add(new KeyValuePair <string, string>("Contributor", contributer)); } string duration = DidlLiteAdapter.Duration(iItem); if (duration != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Duration", duration)); fullList.Add(new KeyValuePair <string, string>("Duration", duration)); } string size = DidlLiteAdapter.Size(iItem); if (size != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Size", size)); fullList.Add(new KeyValuePair <string, string>("Size", size)); } string bitrate = DidlLiteAdapter.Bitrate(iItem); if (bitrate != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Bitrate", bitrate)); fullList.Add(new KeyValuePair <string, string>("Bitrate", bitrate)); } string sampleRate = DidlLiteAdapter.SampleRate(iItem); if (sampleRate != string.Empty) { displayList.Add(new KeyValuePair <string, string>("SampleRate", sampleRate)); fullList.Add(new KeyValuePair <string, string>("SampleRate", sampleRate)); } string bitDepth = DidlLiteAdapter.BitDepth(iItem); if (bitDepth != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Bit Depth", bitDepth)); fullList.Add(new KeyValuePair <string, string>("Bit Depth", bitDepth)); } string mimeType = DidlLiteAdapter.MimeType(iItem); if (mimeType != string.Empty) { fullList.Add(new KeyValuePair <string, string>("Mime Type", mimeType)); } string protocolInfo = DidlLiteAdapter.ProtocolInfo(iItem); if (protocolInfo != string.Empty) { fullList.Add(new KeyValuePair <string, string>("Protocol Info", protocolInfo)); } string description = DidlLiteAdapter.Description(iItem); if (description != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Description", description)); fullList.Add(new KeyValuePair <string, string>("Description", description)); } string info = DidlLiteAdapter.Info(iItem); if (info != string.Empty) { displayList.Add(new KeyValuePair <string, string>("Info", description)); fullList.Add(new KeyValuePair <string, string>("Info", description)); } string uri = DidlLiteAdapter.Uri(iItem); if (uri != string.Empty) { fullList.Add(new KeyValuePair <string, string>("Uri", uri)); } Uri artworkUri = DidlLiteAdapter.ArtworkUri(iItem); if (artworkUri != null) { fullList.Add(new KeyValuePair <string, string>("Artwork Uri", artworkUri.OriginalString)); } } iFullInfoList = fullList; iDisplayInfoList = displayList; iParsed = true; } } }
protected override void EventListViewLibrary_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { TextFormatFlags flags = TextFormatFlags.VerticalCenter | TextFormatFlags.NoPrefix | TextFormatFlags.EndEllipsis; // Because of a bug in the underlying Win32 control, the DrawItem event occurs without accompanying DrawSubItem events once per row in the // details view when the mouse pointer moves over the row, causing anything painted in a DrawSubItem event handler to be painted over by a // custom background drawn in a DrawItem event handler. See the example in the OwnerDraw reference topic for a workaround that invalidates // each row when the extra event occurs. An alternative workaround is to put all your custom drawing code in a DrawSubItem event handler // and paint the background for the entire item (including subitems) only when the DrawListViewSubItemEventArgs.ColumnIndex value is 0. if (e.ColumnIndex == 0) { e.Graphics.FillRectangle(iBackBrush, e.Bounds); if (iIsAlbum && Items.Count > 0) { ListViewKinsky.Item item = Items[0] as ListViewKinsky.Item; musicTrack track = item.Tag as musicTrack; int iconHeight = (int)(Columns[0].Width * 0.5f); int iconOffset = 5;// (int)((Columns[0].Width - iconHeight) * 0.5f); Image albumArt = item.Icon; if (albumArt != null) { e.Graphics.FillRectangle(iBackBrush, item.Bounds.Left + iconOffset, item.Bounds.Top + iconOffset, iconHeight, iconHeight); try { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; e.Graphics.DrawImage(albumArt, item.Bounds.Left + iconOffset, item.Bounds.Top + iconOffset, iconHeight, iconHeight); } catch (ArgumentException ex) { Trace.WriteLine(Trace.kKinsky, "ListViewLibrary.EventListViewLibrary_DrawSubItem: " + ex.Message); } } if (track != null) { int x = item.Bounds.Left + iconOffset + iconHeight + iconOffset; int y = item.Bounds.Top + iconOffset; int width = Columns[0].Width + item.Bounds.Left; int height = iFont.Height; e.Graphics.FillRectangle(iBackBrush, new Rectangle(x, y, width - x, height * 4)); string album = DidlLiteAdapter.Album(track); if (!string.IsNullOrEmpty(album)) { TextRenderer.DrawText(e.Graphics, album, iFont, new Rectangle(x, y, width - x, height), ForeColor, flags); y += height; } string artist = DidlLiteAdapter.AlbumArtist(track); if (!string.IsNullOrEmpty(artist)) { TextRenderer.DrawText(e.Graphics, artist, iFont, new Rectangle(x, y, width - x, height), Color.DarkGray, flags); y += height; } string genre = DidlLiteAdapter.Genre(track); if (!string.IsNullOrEmpty(genre)) { TextRenderer.DrawText(e.Graphics, genre, iFont, new Rectangle(x, y, width - x, height), Color.DarkGray, flags); y += height; } TextRenderer.DrawText(e.Graphics, DidlLiteAdapter.ReleaseYear(track), iFont, new Rectangle(x, y, width - x, height), Color.DarkGray, flags); } } } //Console.WriteLine("columIndex=" + e.ColumnIndex + ", header=" + e.Header + ", item=" + e.Item + ", itemIndex=" + e.ItemIndex + ", subItem=" + e.SubItem); //e.DrawDefault = true; //return; if (e.ColumnIndex > 0) { if (e.Item.Selected) { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; e.Graphics.FillRectangle(iHighlightBackBrush, e.Bounds); } else { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; e.Graphics.FillRectangle(iBackBrush, e.Bounds); } } ListViewItem.ListViewSubItem subItem = null; for (int i = 0; i < e.Item.SubItems.Count; ++i) { if (e.Item.SubItems[i].Name == e.Header.Name) { subItem = e.Item.SubItems[i]; break; } } if (subItem != null) { if (e.Item.Selected) { TextRenderer.DrawText(e.Graphics, subItem.Text, iFont, e.Bounds, HighlightForeColour, flags); } else { if (e.Header.Name != "Title") { TextRenderer.DrawText(e.Graphics, subItem.Text, iFont, e.Bounds, ForeColorMuted, flags); } else { TextRenderer.DrawText(e.Graphics, subItem.Text, iFont, e.Bounds, ForeColor, flags); } } } }