public void DoIt(IEnumerable<int> itemsToChange, ProgressState state)
{
CheckDisposed();
string labelToShow = SelectedLabel;
var selectedObject = m_cache.ServiceLocator.GetInstance<ICmObjectRepository>().GetObject(SelectedHvo);
int i = 0;
// Report progress 50 times or every 100 items, whichever is more (but no more than once per item!)
int interval = Math.Min(100, Math.Max(itemsToChange.Count()/50, 1));
m_cache.DomainDataByFlid.BeginUndoTask(FdoUiStrings.ksUndoBEPhonemeFeatures, FdoUiStrings.ksRedoBEPhonemeFeatures);
if (SelectedHvo != 0)
{
IFsFeatStruc fsTarget = GetTargetFsFeatStruc();
foreach (var hvoPhoneme in itemsToChange)
{
i++;
if (i%interval == 0)
{
state.PercentDone = i * 100 / itemsToChange.Count() + 20;
state.Breath();
}
var phoneme = m_cache.ServiceLocator.GetInstance<IPhPhonemeRepository>().GetObject(hvoPhoneme);
if (phoneme.FeaturesOA == null)
phoneme.FeaturesOA = Cache.ServiceLocator.GetInstance<IFsFeatStrucFactory>().Create();
if (fsTarget == null && selectedObject is IFsClosedFeature)
{ // it's the remove option
var closedValues = from s in phoneme.FeaturesOA.FeatureSpecsOC
where s.FeatureRA == selectedObject
select s;
if (closedValues.Any())
phoneme.FeaturesOA.FeatureSpecsOC.Remove(closedValues.First());
}
else
{
phoneme.FeaturesOA.PriorityUnion(fsTarget);
}
}
}
m_cache.DomainDataByFlid.EndUndoTask();
}