/// <summary>
        /// Обновление статуса и команд правого элемента на основе дочерних.
        /// </summary>
        /// <param name="synchronizedItems">Синхронизируемые элементы, статусы и команды которых будут обновлены.</param>
        public void RefreshRightItemStatusesAndCommandsFromChilds(ISynchronizedItems synchronizedItems)
        {
            if (synchronizedItems.ChildItemsCount > 0)
            {
                var notEquallyChilds = synchronizedItems.ChildItems.Where(r => r.RightItem.Status.StatusEnum != ItemStatusEnum.Equally).ToArray();

                if (notEquallyChilds.Length == 0)
                {
                    // Если все дочерние строки имеют статус Equally, то и данная строка должна иметь такой сатус, и команд никаких быть при этом не должно.
                    synchronizedItems.RightItem.UpdateStatus(ItemStatusEnum.Equally);
                    synchronizedItems.RightItem.SyncCommand.SetCommandAction(null);
                }
                else if (notEquallyChilds.Any(r => r.RightItem.Status.StatusEnum == ItemStatusEnum.Unknown))
                {
                    ItemStatusUnknown(synchronizedItems.RightItem);
                }
                else
                {
                    var rightStatuses = notEquallyChilds.Select(r => r.RightItem.Status.StatusEnum).Distinct().ToArray();

                    if (rightStatuses.Length == 1)
                    {
                        SetItemStatusAndCommands(synchronizedItems.RightItem, rightStatuses.First(), notEquallyChilds.Select(r => r.RightItem.SyncCommand.CommandAction));
                    }
                    else
                    {
                        ItemStatusUnknown(synchronizedItems.RightItem);
                    }
                }
            }
        }
Exemple #2
0
        private void RemoveSynchronizedDirectories(ISynchronizedItems synchronizedDirectories)
        {
            var removingRow = Rows.Single(r => r.LeftItem.Directory == synchronizedDirectories.LeftDirectory &&
                                          r.RightItem.Directory == synchronizedDirectories.RightDirectory);

            DeleteRow(null, removingRow);
        }
 private void AddChildRows(IRowViewModel row, ISynchronizedItems synchronizedItems)
 {
     foreach (var child in synchronizedItems.ChildItems)
     {
         var childRow = CreateRowViewModel(child);
         child.DeletedEvent += () =>
         {
             DeleteRowEvent?.Invoke(row, childRow);
         };
         AddRowEvent?.Invoke(row, childRow);
     }
 }
        /// <summary>
        /// Создание строки, отображающей отслеживаемые элементы.
        /// </summary>
        /// <param name="synchronizedItems">Пара синхронизируемых элементов, на основе которых строится строка.</param>
        /// <returns>Строка, отображающая отслеживаемые элементы.</returns>
        public IRowViewModel CreateRowViewModel(ISynchronizedItems synchronizedItems)
        {
            var result = new RowViewModel(new ItemViewModel(synchronizedItems.LeftItem),
                                          new ItemViewModel(synchronizedItems.RightItem), null);

            synchronizedItems.InProcessChangedEvent += (bool inProcess) => { result.InProcess = inProcess; };

            AddChildRows(result, synchronizedItems);

            synchronizedItems.DirectoriesIsLoadedEvent += (ISynchronizedItems loadedItems) =>
            {
                AddChildRows(result, loadedItems);
            };

            return(result);
        }
Exemple #5
0
        private void AddChildItem(ISynchronizedItems child)
        {
            _childItemsLock.EnterWriteLock();
            try
            {
                _childItems.Add(child);
            }
            finally
            {
                _childItemsLock.ExitWriteLock();
            }

            child.DeleteEvent += DeleteChild;
            child.LeftItem.StatusChangedEvent  += RefreshLeftItemStatusAndCommands;
            child.RightItem.StatusChangedEvent += RefreshRightItemStatusAndCommands;
            child.InProcessChangedEvent        += ChildInProcessChanged;
        }
Exemple #6
0
        private void DeleteChildWithoutUpdateParent(ISynchronizedItems child)
        {
            _childItemsLock.EnterWriteLock();
            try
            {
                _childItems.Remove(child);
            }
            finally
            {
                _childItemsLock.ExitWriteLock();
            }

            // Раз строка удаляется, больше за ней следить не надо.
            child.DeleteEvent -= DeleteChild;
            child.LeftItem.StatusChangedEvent  -= RefreshLeftItemStatusAndCommands;
            child.RightItem.StatusChangedEvent -= RefreshRightItemStatusAndCommands;

            child.IsDeleted();
        }
        private ISynchronizedItem GetChildItemByName(ISynchronizedItems synchronizedItems, bool isLeft, string childItemName)
        {
            var item = isLeft ? synchronizedItems.LeftItem : synchronizedItems.RightItem;

            if (item.Name == childItemName)
            {
                return(item);
            }
            foreach (var childItem in synchronizedItems.ChildItems)
            {
                var result = GetChildItemByName(childItem, isLeft, childItemName);
                if (result != null)
                {
                    return(result);
                }
            }

            return(null);
        }
Exemple #8
0
 private void DeleteChild(ISynchronizedItems deletingItems)
 {
     DeleteChildWithoutUpdateParent(deletingItems);
     RefreshLeftItemStatusAndCommands();
     RefreshRightItemStatusAndCommands();
 }
Exemple #9
0
 private void AddSynchronizedDirectories(ISynchronizedItems synchronizedDirectories)
 {
     AddRow(null, _rowViewModelFactory.CreateRowViewModel(synchronizedDirectories));
 }
 public void RefreshRightItemStatusesAndCommandsFromChilds(ISynchronizedItems synchronizedItems)
 {
     RefreshedRightItemSynchronizedItemsList.Add(synchronizedItems);
 }
        public async Task Load()
        {
            var testSettingsStorage = new TestSettingsStorage();
            ISynchronizedItems removedSynchronizedDirectories = null;
            var loadedDirectories = new List <IDirectory>();

            using (var testDirectory = new TestDirectory())
            {
                var settingsRow1 = new SettingsRow(testDirectory.CreateDirectory("1"), testDirectory.CreateDirectory("2"), true, null);
                var settingsRow2 = new SettingsRow(testDirectory.CreateDirectory("3"), testDirectory.CreateDirectory("4"), false, null);
                var settingsRow3 = new SettingsRow(testDirectory.CreateDirectory("5"), testDirectory.CreateDirectory("6"), true, new[] { "tiff" });
                var settingsRow4 = new SettingsRow(testDirectory.CreateDirectory("7"), testDirectory.CreateDirectory("8"), true, new[] { "tiff" });
                var settingsRow5 = new SettingsRow(testDirectory.CreateDirectory("9"), testDirectory.CreateDirectory("10"), true, null);

                testSettingsStorage.SettingsRows = new[]
                {
                    settingsRow1,
                    settingsRow2,
                    settingsRow3,
                    settingsRow4,
                    settingsRow5
                };

                var synchronizedDirectoriesManager = new SynchronizedDirectoriesManager(testSettingsStorage, new SynchronizedItemFactory(new ItemFactory()),
                                                                                        new SynchronizedItemsStatusAndCommandsUpdater(null));

                await synchronizedDirectoriesManager.Load(); // Загрузка до изменения настроек.

                var oldSynchronizedDirectory2 = synchronizedDirectoriesManager.SynchronizedDirectories[1];
                var oldSynchronizedDirectory3 = synchronizedDirectoriesManager.SynchronizedDirectories[2];
                var oldSynchronizedDirectory4 = synchronizedDirectoriesManager.SynchronizedDirectories[3];

                foreach (var synchronizedDirectory in synchronizedDirectoriesManager.SynchronizedDirectories)
                {
                    synchronizedDirectory.LeftDirectory.LoadedDirectoryEvent  += (IDirectory loadedDirecory) => { loadedDirectories.Add(loadedDirecory); };
                    synchronizedDirectory.RightDirectory.LoadedDirectoryEvent += (IDirectory loadedDirecory) => { loadedDirectories.Add(loadedDirecory); };
                }

                synchronizedDirectoriesManager.RemoveSynchronizedDirectoriesEvent += (ISynchronizedItems synchronizedDirectories) =>
                {
                    removedSynchronizedDirectories = synchronizedDirectories;
                };
                settingsRow1.IsUsed = false; // Эта строка при загрузке должна будет удалиться.
                settingsRow2.IsUsed = true;  // Эта строка при загрузке должна будет добавиться.

                // Эта строка при загрузке должна будет инициализировать новую из-за изменения коллекции ExcludedExtensions.
                settingsRow3.ExcludedExtensions = new[] { "jpg" };

                await synchronizedDirectoriesManager.Load(); // Загрузка после изменения настроек.

                Assert.Equal(4, synchronizedDirectoriesManager.SynchronizedDirectories.Length);

                // Проверим удалённую директорию.
                Assert.NotNull(removedSynchronizedDirectories);
                Assert.Equal(settingsRow1.LeftDirectory.DirectoryPath, removedSynchronizedDirectories.LeftDirectory.FullPath);
                Assert.Equal(settingsRow1.RightDirectory.DirectoryPath, removedSynchronizedDirectories.RightDirectory.FullPath);

                // Записи на синхронизируемые директории должны оставаться прежними.
                Assert.Equal(oldSynchronizedDirectory2, synchronizedDirectoriesManager.SynchronizedDirectories[0]);
                Assert.Equal(oldSynchronizedDirectory3, synchronizedDirectoriesManager.SynchronizedDirectories[1]);
                Assert.Equal(oldSynchronizedDirectory4, synchronizedDirectoriesManager.SynchronizedDirectories[2]);

                // Лишь две директории одной записи должны были обновиться.
                Assert.Equal(2, loadedDirectories.Count);
                Assert.Contains(oldSynchronizedDirectory2.LeftDirectory, loadedDirectories);
                Assert.Contains(oldSynchronizedDirectory2.RightDirectory, loadedDirectories);

                // И массивы исключаемых из рассмотрения расширений файлов тоже должны были обновиться.
                Assert.Equal(settingsRow3.ExcludedExtensions, oldSynchronizedDirectory2.LeftDirectory.ExcludedExtensions);
                Assert.Equal(settingsRow3.ExcludedExtensions, oldSynchronizedDirectory2.RightDirectory.ExcludedExtensions);

                // Эта запись на синхронизируемую директорию должна быть добавленной из-за включения строки настройки.
                var synchronizedDirectory3 = synchronizedDirectoriesManager.SynchronizedDirectories[3];
                Assert.Equal(settingsRow2.LeftDirectory.DirectoryPath, synchronizedDirectory3.LeftDirectory.FullPath);
                Assert.Equal(settingsRow2.RightDirectory.DirectoryPath, synchronizedDirectory3.RightDirectory.FullPath);
            }
        }