Click here to Skip to main content
15,886,362 members
Articles / Desktop Programming / WPF

Wrap Panel Virtualization

Rate me:
Please Sign up or sign in to vote.
4.95/5 (18 votes)
2 Jan 2012CPOL2 min read 53.2K   5.6K   41  
WrapPanel doesn't support virtualization. But we can improve the performance by simulating virtualization.
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Windows;
using MediaAssistant.Controls.Dialog;
using MediaAssistant.Controls.WaitScreen;
using MediaAssistant.Data;
using MefBasic;
using MediaAssistant.DAL;
using MediaAssistant.DAL.Constants;
using MefBasic.Extensions;

namespace MediaAssistant.Controls.TagEditor
{
    [Export]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class TagEditorPresenter : APresenter<TagEditorView>, IDialogContentPresenter
    {
        [ImportingConstructor]
        public TagEditorPresenter(TagEditorView view)
            : base(view)
        {

        }

        public DialogResult ShowDialog(IEnumerable<Music> musics)
        {
            SetupInitialProperties(musics);
            var dialogResult = Resolve<IDialogPresenter>().ShowDialog("Edit Tags", this);
            if(dialogResult==DialogResult.Ok)
            {
                UpdateMusics(musics);
            }
            return dialogResult;
        }

        private void UpdateMusics(IEnumerable<Music> musics)
        {
            var index = 1;
            Resolve<WaitScreenPresenter>().Show(0, musics.Count(), index);
            foreach (var music in musics)
            {
                if(IsEditTitleChecked)
                {
                    music.Title = IsUseFilenameChecked ? Path.GetFileNameWithoutExtension(music.FileName) : Title;
                }
                if (IsAlbumEditable)
                    music.Album = Album;
                if (IsArtistEditable)
                    music.Artist = Artist;
                if (IsComposerEditable)
                    music.Composer = Composer;
                if (IsGenreEditable)
                    music.Genre = Genre;
                DataSource.UpdateMusic(music);
                Application.Current.DoEvents();
                Resolve<WaitScreenPresenter>().Show(0, musics.Count(), index++);
            }
            DataSource.UpdateCurrentLists();
        }

        private void SetupInitialProperties(IEnumerable<Music> musics)
        {
            Albums = DatabaseManager.Instance.GetKnownLibraryItems(LibraryItemType.Album).Select(o => o.Title).OrderBy(o => o);
            Artists = DatabaseManager.Instance.GetKnownLibraryItems(LibraryItemType.Artist).Select(o => o.Title).OrderBy(o => o);
            Composers = DatabaseManager.Instance.GetKnownLibraryItems(LibraryItemType.Composer).Select(o => o.Title).OrderBy(o => o);
            Genres = DatabaseManager.Instance.GetKnownLibraryItems(LibraryItemType.Genre).Select(o => o.Title).OrderBy(o => o);
            var selectedMusicAlbums = musics.Where(m => !string.IsNullOrWhiteSpace(m.Album)).Select(m => m.Album).Distinct();
            if (selectedMusicAlbums.Count() <= 1)
            {
                Album = selectedMusicAlbums.SingleOrDefault();
                IsAlbumEditable = true;
            }
            var selectedMusicArtists = musics.Where(m => !string.IsNullOrWhiteSpace(m.Artist)).Select(m => m.Artist).Distinct();
            if (selectedMusicArtists.Count() <= 1)
            {
                Artist = selectedMusicArtists.SingleOrDefault();
                IsArtistEditable = true;
            }
            var selectedMusicComposers = musics.Where(m => !string.IsNullOrWhiteSpace(m.Composer)).Select(m => m.Composer).Distinct();
            if (selectedMusicComposers.Count() <= 1)
            {
                Composer = selectedMusicComposers.SingleOrDefault();
                IsComposerEditable = true;
            }
            var selectedMusicGenres = musics.Where(m => !string.IsNullOrWhiteSpace(m.Genre)).Select(m => m.Genre).Distinct();
            if (selectedMusicGenres.Count() <= 1)
            {
                Genre = selectedMusicGenres.SingleOrDefault();
                IsGenreEditable = true;
            }
            var selectedTitles = musics.Where(m => !string.IsNullOrWhiteSpace(m.Title)).Select(m => m.Title).Distinct();
            if (selectedTitles.Count() <= 1)
            {
                Title = selectedTitles.SingleOrDefault();
                IsEditTitleChecked = true;
            }
        }

        public bool OnClosing(DialogResult dialogResult)
        {
            return true;
        }

        [Import]
        public LibraryDataSource DataSource
        {
            get { return (LibraryDataSource)GetValue(DataSourceProperty); }
            set { SetValue(DataSourceProperty, value); }
        }

        public static readonly DependencyProperty DataSourceProperty =
            DependencyProperty.Register("DataSource", typeof(LibraryDataSource), typeof(TagEditorPresenter), new UIPropertyMetadata(null));



        public IEnumerable<string> Albums
        {
            get { return (IEnumerable<string>)GetValue(AlbumsProperty); }
            set { SetValue(AlbumsProperty, value); }
        }

        public static readonly DependencyProperty AlbumsProperty =
            DependencyProperty.Register("Albums", typeof(IEnumerable<string>), typeof(TagEditorPresenter), new UIPropertyMetadata(null));



        public string Album
        {
            get { return (string)GetValue(AlbumProperty); }
            set { SetValue(AlbumProperty, value); }
        }

        public static readonly DependencyProperty AlbumProperty =
            DependencyProperty.Register("Album", typeof(string), typeof(TagEditorPresenter), new UIPropertyMetadata(null));



        public bool IsAlbumEditable
        {
            get { return (bool)GetValue(IsAlbumEditableProperty); }
            set { SetValue(IsAlbumEditableProperty, value); }
        }

        public static readonly DependencyProperty IsAlbumEditableProperty =
            DependencyProperty.Register("IsAlbumEditable", typeof(bool), typeof(TagEditorPresenter), new UIPropertyMetadata(false));



        public bool IsArtistEditable
        {
            get { return (bool)GetValue(IsArtistEditableProperty); }
            set { SetValue(IsArtistEditableProperty, value); }
        }

        public static readonly DependencyProperty IsArtistEditableProperty =
            DependencyProperty.Register("IsArtistEditable", typeof(bool), typeof(TagEditorPresenter), new UIPropertyMetadata(false));



        public IEnumerable<string> Artists
        {
            get { return (IEnumerable<string>)GetValue(ArtistsProperty); }
            set { SetValue(ArtistsProperty, value); }
        }

        public static readonly DependencyProperty ArtistsProperty =
            DependencyProperty.Register("Artists", typeof(IEnumerable<string>), typeof(TagEditorPresenter), new UIPropertyMetadata(null));


        public string Artist
        {
            get { return (string)GetValue(ArtistProperty); }
            set { SetValue(ArtistProperty, value); }
        }

        public static readonly DependencyProperty ArtistProperty =
            DependencyProperty.Register("Artist", typeof(string), typeof(TagEditorPresenter), new UIPropertyMetadata(null));


        public IEnumerable<string> Composers
        {
            get { return (IEnumerable<string>)GetValue(ComposersProperty); }
            set { SetValue(ComposersProperty, value); }
        }

        public static readonly DependencyProperty ComposersProperty =
            DependencyProperty.Register("Composers", typeof(IEnumerable<string>), typeof(TagEditorPresenter), new UIPropertyMetadata(null));


        public string Composer
        {
            get { return (string)GetValue(ComposerProperty); }
            set { SetValue(ComposerProperty, value); }
        }

        public static readonly DependencyProperty ComposerProperty =
            DependencyProperty.Register("Composer", typeof(string), typeof(TagEditorPresenter), new UIPropertyMetadata(null));


        public bool IsComposerEditable
        {
            get { return (bool)GetValue(IsComposerEditableProperty); }
            set { SetValue(IsComposerEditableProperty, value); }
        }

        public static readonly DependencyProperty IsComposerEditableProperty =
            DependencyProperty.Register("IsComposerEditable", typeof(bool), typeof(TagEditorPresenter), new UIPropertyMetadata(false));


        public IEnumerable<string> Genres
        {
            get { return (IEnumerable<string>)GetValue(GenresProperty); }
            set { SetValue(GenresProperty, value); }
        }

        public static readonly DependencyProperty GenresProperty =
            DependencyProperty.Register("Genres", typeof(IEnumerable<string>), typeof(TagEditorPresenter), new UIPropertyMetadata(null));


        public string Genre
        {
            get { return (string)GetValue(GenreProperty); }
            set { SetValue(GenreProperty, value); }
        }

        public static readonly DependencyProperty GenreProperty =
            DependencyProperty.Register("Genre", typeof(string), typeof(TagEditorPresenter), new UIPropertyMetadata(null));



        public bool IsGenreEditable
        {
            get { return (bool)GetValue(IsGenreEditableProperty); }
            set { SetValue(IsGenreEditableProperty, value); }
        }

        public static readonly DependencyProperty IsGenreEditableProperty =
            DependencyProperty.Register("IsGenreEditable", typeof(bool), typeof(TagEditorPresenter), new UIPropertyMetadata(false, OnPropertyChanged));

        protected override void DoPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            switch (e.Property.Name)
            {
                case "IsEditTitleChecked":
                    IsTitleEditable = IsUseFilenameChecked == false && IsEditTitleChecked;
                    break;
                case "IsUseFilenameChecked":
                    if (IsUseFilenameChecked)
                        IsEditTitleChecked = true;
                    IsTitleEditable = IsUseFilenameChecked == false && IsEditTitleChecked;
                    break;
            }
        }
        
        public bool IsEditTitleChecked
        {
            get { return (bool)GetValue(IsEditTitleCheckedProperty); }
            set { SetValue(IsEditTitleCheckedProperty, value); }
        }

        public static readonly DependencyProperty IsEditTitleCheckedProperty =
            DependencyProperty.Register("IsEditTitleChecked", typeof(bool), typeof(TagEditorPresenter), new UIPropertyMetadata(false, OnPropertyChanged));



        public bool IsUseFilenameChecked
        {
            get { return (bool)GetValue(IsUseFilenameCheckedProperty); }
            set { SetValue(IsUseFilenameCheckedProperty, value); }
        }

        public static readonly DependencyProperty IsUseFilenameCheckedProperty =
            DependencyProperty.Register("IsUseFilenameChecked", typeof(bool), typeof(TagEditorPresenter), new UIPropertyMetadata(false, OnPropertyChanged));

        public bool IsTitleEditable
        {
            get { return (bool)GetValue(IsTitleEditableProperty); }
            set { SetValue(IsTitleEditableProperty, value); }
        }

        public static readonly DependencyProperty IsTitleEditableProperty =
            DependencyProperty.Register("IsTitleEditable", typeof(bool), typeof(TagEditorPresenter), new UIPropertyMetadata(false));



        public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }

        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(TagEditorPresenter), new UIPropertyMetadata(null));

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) KAZ Software Limited
Bangladesh Bangladesh
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions