Example #1
0
        public GeneralViewModel()
        {
            _players = new DispatcherCollection<DisplayableItem<string>>(DispatcherHelper.UIDispatcher);
            _players.Add(new DisplayableItem<string>("mpc", "Media General Classic"));
            _screens = new DispatcherCollection<DisplayableItem<int>>(DispatcherHelper.UIDispatcher);
            var i = 1;
            foreach (Screen screen in Screen.AllScreens)
            {
                _screens.Add(new DisplayableItem<int>(i++, ScreenUtils.GetDisplayDevice(screen.DeviceName).DeviceString));
            }
            CurrentScreen = App.Config.ScreenNo;
            _monitorDirectories = new ObservableCollection<string>(App.Config.MonitorDirectories);


            var monitorDirectoriesListener = new CollectionChangedEventListener(_monitorDirectories)
            {
                (sender, args) =>
                {
                    App.Config.MonitorDirectories = _monitorDirectories;
                    App.Client.ResetLibraryUpdater();
                }
            };
            CompositeDisposable.Add(monitorDirectoriesListener);

        }
        public void BasicConstructorLifeCycleTest()
        {
            var listenerSuccess = false;

            var publisher = new TestEventPublisher();

            var listener = new CollectionChangedEventListener(publisher, (sender, e) => listenerSuccess = true);

            //------------------
            listenerSuccess.Is(false);

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            listenerSuccess.Is(true);

            //------------------
            listenerSuccess = false;

            listener.Dispose();
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            listenerSuccess.Is(false);

            try
            {
                listener.RegisterHandler((sender, e) => listenerSuccess = true);
            }
            catch (Exception e)
            {
                e.GetType().Is(typeof(ObjectDisposedException));
            }
        }
        public void FilteredHandlerLifeCycleTest()
        {
            var handler1Called = false;
            var handler2Called = false;
            var handler3Called = false;

            var publisher = new TestEventPublisher();

            var listener = new CollectionChangedEventListener(publisher);

            //------------------
            listener.RegisterHandler(NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler1Called = true; });
            listener.RegisterHandler(NotifyCollectionChangedAction.Remove, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler2Called = true; });
            listener.RegisterHandler(NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler3Called = true; });

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null);

            handler1Called.Is(true);
            handler2Called.Is(true);
            handler3Called.Is(true);

            //------------------
            handler1Called = false;
            handler2Called = false;
            handler3Called = false;

            listener.Dispose();
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null);

            handler1Called.Is(false);
            handler2Called.Is(false);
            handler3Called.Is(false);
        }
        public void MultipleHandlerLifeCycleTest()
        {
            var handler1Success = false;
            var handler2Success = false;

            var publisher = new TestEventPublisher();

            var listener = new CollectionChangedEventListener(publisher);

            //------------------
            handler1Success.Is(false);
            handler2Success.Is(false);

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handler1Success.Is(false);
            handler2Success.Is(false);

            //------------------
            listener.RegisterHandler((sender, e) => handler1Success = true);

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handler1Success.Is(true);
            handler2Success.Is(false);

            //------------------
            handler1Success = false;
            handler2Success = false;

            listener.RegisterHandler((sender, e) => handler2Success = true);

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handler1Success.Is(true);
            handler2Success.Is(true);

            //------------------
            handler1Success = false;
            handler2Success = false;

            listener.Dispose();
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handler1Success.Is(false);
            handler2Success.Is(false);
        }
        public void SourceReferenceMemoryLeakTest()
        {
            var handler1Success = false;

            var publisherStrongReference = new TestEventPublisher();
            var publisherWeakReference = new WeakReference<TestEventPublisher>(publisherStrongReference);

            var listener = new CollectionChangedEventListener(publisherStrongReference);
            listener.RegisterHandler((sender, e) => handler1Success = true);

            publisherStrongReference.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handler1Success.Is(true);
            listener.Dispose();
            publisherStrongReference = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            TestEventPublisher resultPublisher = null;
            publisherWeakReference.TryGetTarget(out resultPublisher).Is(false);
            resultPublisher.IsNull();
        }
        public void MultiThreadHandlerTest()
        {
            var publisher = new TestEventPublisher();

            var listener = new CollectionChangedEventListener(publisher);

            var handlerCalledCount = 0;

            var parentTask = new Task(() =>
            {
                var tf = new TaskFactory(TaskCreationOptions.AttachedToParent, TaskContinuationOptions.AttachedToParent);

                for (int i = 0; i < 50; i++)
                {
                    tf.StartNew(() =>
                    {
                        for (int f = 0; f < 500; f++)
                        {
                            listener.RegisterHandler(NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handlerCalledCount++; });
                        }

                    });
                }
            });

            parentTask.Start();
            parentTask.Wait();

            handlerCalledCount.Is(0);

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handlerCalledCount.Is(25000);

            handlerCalledCount = 0;

            listener.Dispose();
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handlerCalledCount.Is(0);
        }
        public void AddHandlerKindTest()
        {
            var handler1Called = false;
            var handler2Called = false;
            var handler3Called = false;
            var handler4Called = false;
            var handler5Called = false;

            var publisher = new TestEventPublisher();
            var listener1 = new CollectionChangedEventListener(publisher)
            {
                {NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler1Called = true; }},
                {NotifyCollectionChangedAction.Remove,
                        (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler2Called = true;},
                        (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler3Called = true;}
                },
                (sender,e) => handler4Called = true,
                {NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler5Called = true; }}
            };

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Reset,null);

            handler1Called.Is(false);
            handler2Called.Is(false);
            handler3Called.Is(false);
            handler4Called.Is(true);
            handler5Called.Is(false);

            handler4Called = false;

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handler1Called.Is(true);
            handler2Called.Is(false);
            handler3Called.Is(false);
            handler4Called.Is(true);
            handler5Called.Is(true);

            handler1Called = false;
            handler4Called = false;
            handler5Called = false;

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null);

            handler1Called.Is(false);
            handler2Called.Is(true);
            handler3Called.Is(true);
            handler4Called.Is(true);
            handler5Called.Is(false);

            handler1Called = false;
            handler2Called = false;
            handler3Called = false;
            handler4Called = false;
            handler5Called = false;

            listener1.Dispose();

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null);

            handler1Called.Is(false);
            handler2Called.Is(false);
            handler3Called.Is(false);
            handler4Called.Is(false);
            handler5Called.Is(false);
        }
            public HandlerMemoryLeakTestClass(INotifyCollectionChanged publisher)
            {
                Listener = new CollectionChangedEventListener(publisher);

                // This handler refers "this".
                NotifyCollectionChangedEventHandler handler = (sender, e) => { ToString(); };
                Listener.RegisterHandler(handler);
                Listener.RegisterHandler(NotifyCollectionChangedAction.Reset, handler);
            }
Example #9
0
        /// <summary>
        ///     リスナーを生成します。
        /// </summary>
        private void CreateListener()
        {
            var h = _searchTextChangedSubject
                .Throttle(TimeSpan.FromMilliseconds(1000))
                //.DistinctUntilChanged()
                .Subscribe(x =>
                {
                    // テキストフィルタリングする
                    _client.FilteringLibrary(x);
                });


            // データベース変更イベントリスナー
            var databaseListener = new CollectionChangedEventListener(_client.Databases)
            {
                (sender, args) =>
                {
                    // データベース選択復元
                    CurrentDatabase = Databases.SingleOrDefault(x => x.Name == _client.AppConfig.SelectDatabase);
                }
            };
            CompositeDisposable.Add(databaseListener);

            // ライブラリ変更イベントリスナー
            var libraryListener = new CollectionChangedEventListener(_client.Libraries)
            {
                (sender, args) => LibraryCount = _client.Libraries.Count()
            };
            CompositeDisposable.Add(libraryListener);

            // フィルタリング変更イベントリスナー
            var filteringListener = new CollectionChangedEventListener(_client.Filterings)
            {
                (sender, args) =>
                {
                    // フィルタリング選択復元
                    var filteringSelect =
                        _filterings.FirstOrDefault(x => x.Model.DisplayValue == AppConfig.SelectFiltering);
                    if (filteringSelect != null) filteringSelect.IsSelected = true;
                }
            };
            CompositeDisposable.Add(filteringListener);

            // 設定変更イベントリスナー
            var configListener = new PropertyChangedEventListener(AppConfig)
            {
                {"AccentColor", (sender, args) => AppearanceManager.Current.AccentColor = AppConfig.AccentColor},
                {
                    "SelectedTheme",
                    (sender, args) =>
                        AppearanceManager.Current.ThemeSource =
                            AppConfig.SelectedTheme == "light"
                                ? AppearanceManager.LightThemeSource
                                : AppearanceManager.DarkThemeSource
                },
                {
                    "Language", (sender, args) =>
                    {
                        MovselexResource.Current.ChangeCulture(AppConfig.Language);
                        _client.ReloadFiltering();
                    }
                },
                {
                    "MpcExePath", (sender, args) =>
                    {
                        CanThrow = !String.IsNullOrEmpty(AppConfig.MpcExePath);
                        if (_client.IsInitialized) _client.ResetBackgroundWorker();
                    }
                }
            };
            CompositeDisposable.Add(configListener);
        }
Example #10
0
        public void AddHandlerKindTest()
        {
            var handler1Called = false;
            var handler2Called = false;
            var handler3Called = false;
            var handler4Called = false;
            var handler5Called = false;

            var publisher = new TestEventPublisher();
            var listener1 = new CollectionChangedEventListener(publisher)
            {
                { NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler1Called = true; } },
                { NotifyCollectionChangedAction.Remove,
                  (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler2Called = true; },
                  (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Remove); handler3Called = true; } },
                (sender, e) => handler4Called = true,
                { NotifyCollectionChangedAction.Add, (sender, e) => { e.Action.Is(NotifyCollectionChangedAction.Add); handler5Called = true; } }
            };

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Reset, null);

            handler1Called.Is(false);
            handler2Called.Is(false);
            handler3Called.Is(false);
            handler4Called.Is(true);
            handler5Called.Is(false);

            handler4Called = false;

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);

            handler1Called.Is(true);
            handler2Called.Is(false);
            handler3Called.Is(false);
            handler4Called.Is(true);
            handler5Called.Is(true);

            handler1Called = false;
            handler4Called = false;
            handler5Called = false;

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null);

            handler1Called.Is(false);
            handler2Called.Is(true);
            handler3Called.Is(true);
            handler4Called.Is(true);
            handler5Called.Is(false);

            handler1Called = false;
            handler2Called = false;
            handler3Called = false;
            handler4Called = false;
            handler5Called = false;

            listener1.Dispose();

            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Add, null);
            publisher.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove, null);

            handler1Called.Is(false);
            handler2Called.Is(false);
            handler3Called.Is(false);
            handler4Called.Is(false);
            handler5Called.Is(false);
        }
Example #11
0
        public static ReadOnlyDispatcherCollection <TViewModel> CreateReadOnlyDispatcherCollection <TModel, TViewModel>(IList <TModel> source, Func <TModel, TViewModel> converter, Dispatcher dispatcher)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }

            var sourceAsNotifyCollection = source as INotifyCollectionChanged;

            if (sourceAsNotifyCollection == null)
            {
                throw new ArgumentException("sourceがINotifyCollectionChangedを実装していません");
            }

            var initCollection = new ObservableCollection <TViewModel>();
            var internalLock   = new object();

            lock (internalLock)
            {
                var target = new DispatcherCollection <TViewModel>(initCollection, dispatcher);
                var result = new ReadOnlyDispatcherCollection <TViewModel>(target);

                var collectionChangedListener = new CollectionChangedEventListener(sourceAsNotifyCollection);

                result.EventListeners.Add(collectionChangedListener);

                collectionChangedListener.RegisterHandler((sender, e) =>
                {
                    lock (internalLock)
                    {
                        switch (e.Action)
                        {
                        case NotifyCollectionChangedAction.Add:
                            target.Insert(e.NewStartingIndex, converter((TModel)e.NewItems[0]));
                            break;

                        case NotifyCollectionChangedAction.Move:
                            target.Move(e.OldStartingIndex, e.NewStartingIndex);
                            break;

                        case NotifyCollectionChangedAction.Remove:
                            if (typeof(IDisposable).IsAssignableFrom(typeof(TViewModel)))
                            {
                                ((IDisposable)target[e.OldStartingIndex]).Dispose();
                            }
                            target.RemoveAt(e.OldStartingIndex);
                            break;

                        case NotifyCollectionChangedAction.Replace:
                            if (typeof(IDisposable).IsAssignableFrom(typeof(TViewModel)))
                            {
                                ((IDisposable)target[e.NewStartingIndex]).Dispose();
                            }
                            target[e.NewStartingIndex] = converter((TModel)e.NewItems[0]);
                            break;

                        case NotifyCollectionChangedAction.Reset:
                            if (typeof(IDisposable).IsAssignableFrom(typeof(TViewModel)))
                            {
                                foreach (IDisposable item in target)
                                {
                                    item.Dispose();
                                }
                            }
                            target.Clear();
                            break;

                        default:
                            throw new ArgumentException();
                        }
                    }
                });

                foreach (var model in source)
                {
                    initCollection.Add(converter(model));
                }
                return(result);
            }
        }