Filtration/Filtration.ObjectModel/ItemFilterBlock.cs

110 lines
3.2 KiB
C#
Raw Normal View History

2015-06-04 13:15:54 -04:00
using System;
using System.Collections.ObjectModel;
using System.Linq;
2015-06-24 14:57:16 -04:00
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
2015-06-04 13:15:54 -04:00
2015-06-24 14:57:16 -04:00
namespace Filtration.ObjectModel
2015-06-04 13:15:54 -04:00
{
2015-06-24 14:57:16 -04:00
public class ItemFilterBlock
2015-06-04 13:15:54 -04:00
{
private ItemFilterBlockGroup _blockGroup;
public ItemFilterBlock()
2015-06-04 13:15:54 -04:00
{
BlockItems = new ObservableCollection<IItemFilterBlockItem> {new ActionBlockItem(BlockAction.Show)};
2015-06-04 13:15:54 -04:00
}
public string Description { get; set; }
public ItemFilterBlockGroup BlockGroup
{
get { return _blockGroup; }
set
{
var oldBlockGroup = _blockGroup;
_blockGroup = value;
if (_blockGroup != null)
{
_blockGroup.BlockGroupStatusChanged += OnBlockGroupStatusChanged;
if (oldBlockGroup != null)
{
oldBlockGroup.BlockGroupStatusChanged -= OnBlockGroupStatusChanged;
}
}
else
{
if (oldBlockGroup != null)
{
oldBlockGroup.BlockGroupStatusChanged -= OnBlockGroupStatusChanged;
}
}
}
}
2015-06-04 13:15:54 -04:00
public BlockAction Action
{
get
{
var actionBlock = BlockItems.OfType<ActionBlockItem>().First();
return actionBlock.Action;
}
set
{
var actionBlock = BlockItems.OfType<ActionBlockItem>().First();
actionBlock.Action = value;
}
}
public ObservableCollection<IItemFilterBlockItem> BlockItems { get; private set; }
2015-06-04 13:15:54 -04:00
public int BlockCount(Type type)
{
return BlockItems != null ? BlockItems.Count(b => b.GetType() == type) : 0;
}
public bool AddBlockItemAllowed(Type type)
{
var blockItem = (IItemFilterBlockItem)Activator.CreateInstance(type);
2015-06-04 13:15:54 -04:00
return BlockCount(type) < blockItem.MaximumAllowed;
}
2015-06-06 15:44:38 -04:00
public bool HasBlockItemOfType<T>()
{
return BlockItems.Count(b => b is T) > 0;
}
public bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup)
{
if (startingBlockGroup == targetBlockGroup)
{
return true;
}
if (BlockGroup == null)
{
return false;
}
if (startingBlockGroup.ParentGroup != null)
{
return HasBlockGroupInParentHierarchy(targetBlockGroup, startingBlockGroup.ParentGroup);
}
return false;
}
private void OnBlockGroupStatusChanged(object sender, EventArgs e)
{
if (BlockGroup.IsChecked == false && Action == BlockAction.Show)
{
Action = BlockAction.Hide;
}
2015-06-24 14:57:16 -04:00
else if (BlockGroup.IsChecked && Action == BlockAction.Hide)
{
Action = BlockAction.Show;
}
}
2015-06-04 13:15:54 -04:00
}
}