You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
Version 1
Next »
Problem
- Reduce number of exchange items a Linkable component exposes through its interface
Proposal
interface IFilter
{
string ShortName();
string Description();
bool Exclude(IExchangeItem item);
}
// Optional Extension
interface IFilterable
{
int SuggestedFilterCount { get; }
IFilter FilterSugestion(int index);
}
- 3rd parties could also provide library of useful filters
- OmiEd could then make these filters available to the user via the GUI
Examples
static List<IInputExchangeItem> FilteredExchangeItems(ILinkableComponent iLC)
{
List<IInputExchangeItem> items = new List<IInputExchangeItem>();
if (iLC is IFilterable)
{
IFilterable iFilterable = (IFilterable)iLC;
List<IFilter> activeFilters = new List<IFilter>();
// Make all sugestions active, would be GUI controlled,
// and could include 3rd part supplied filters as well
for (int n = 0; n < iFilterable.SuggestedFilterCount; ++n)
activeFilters.Add(iFilterable.FilterSugestion(n));
for (int n = 0; n < iLC.InputExchangeItemCount; ++n)
{
foreach (IFilter f in activeFilters)
{
if (f.Exclude(iLC.GetInputExchangeItem(n)))
continue;
items.Add(iLC.GetInputExchangeItem(n));
}
}
}
else
{
for (int n = 0; n < iLC.InputExchangeItemCount; ++n)
items.Add(iLC.GetInputExchangeItem(n));
}
return items;
}
class LinkableComponent : ILinkableComponent, IFilterable
{
#region ILinkableComponent Members
#endregion
#region IPublisher Members
#endregion
#region IFilterable Members
public int SuggestedFilterCount
{
get { return 1; }
}
public IFilter FilterSugestion(int index)
{
switch (index)
{
case 0:
return new FilterQuantity("Flow");
}
throw new Exception("Out of range");
}
#endregion
}
class FilterIdRegExp : IFilter
{
Regex _reg;
FilterIdRegExp(string reg)
{
_reg = new Regex(reg);
}
string ShortName()
{
return string.Format("Filter on \"{0}\"", _reg);
}
string Description()
{
return string.Format("Filter to match ElementSet Id against Regular Expression {0}", _reg);
}
bool Exclude(IExchangItem item)
{
return !_reg.Match(item.ElementSet().ID());
}
}
class FilterQuantity : IFilter
{
string _quantity;
FilterQuantity(string quantity)
{
_quantity = quantity;
}
string ShortName()
{
return string.Format("Filter on \"{0}\"", _quantity);
}
string Description()
{
return string.Format("Filter to match Quantity Id against \"{0}\"", _quantity);
}
bool Exclude(IExchangItem item)
{
return item.Quantity.ID() != _quantity;
}
}
class FilterRegion : IFilter
{
List<IRegion> _regions;
FilterRegion(List<IRegion> regions)
{
_regions = regions;
}
string ShortName()
{
return "Filter on regions";
}
string Description()
{
return "Filter on regions";
}
bool Exclude(IExchangItem item)
{
foreach (IRegion region in _regions)
if (region.Contains(item.ElementSet()))
return false;
return true;
}
}