private void AddItemBelowContextMenu_Click(object sender, RoutedEventArgs e)
        {
            ClickItem       item = ((MenuItem)sender).CommandParameter as ClickItem;
            ExplanationItem selfExplanationClickItem = new ExplanationItem(captionText: string.Empty);

            selfExplanationClickItem.tagNo = SelfExplanationTagService.GenerateUniqueTag();
            int index;

            if (item is ExplanationItem)
            {
                index = Items.ToList().FindIndex(x => x is ExplanationItem &&
                                                 ((ExplanationItem)x).TagNo == ((ExplanationItem)item).TagNo);
            }
            else
            {
                index = Items.IndexOf(item);
            }
            if (index < listView.Items.Count - 1)
            {
                Items.Insert(index + 1, selfExplanationClickItem);
            }
            else
            {
                Items.Add(selfExplanationClickItem);
            }
            isSynced = false;
            UpdateClickNumAndTriggerInItems(useWorker: false, e: null);
            ScrollItemToView(selfExplanationClickItem);
        }
        private void CreateButton_Click(object sender, RoutedEventArgs e)
        {
            ExplanationItem selfExplanationClickItem = new ExplanationItem(captionText: string.Empty);

            selfExplanationClickItem.tagNo = SelfExplanationTagService.GenerateUniqueTag();
            Items.Add(selfExplanationClickItem);
            isSynced = false;
            UpdateClickNumAndTriggerInItems(useWorker: false, e: null);
            ScrollListViewToEnd();
        }
        private ExplanationItem CreateExpItemFromDictionary(Dictionary <string, string> expItemDic)
        {
            ExplanationItem expItem = new ExplanationItem(expItemDic[ELearningLabText.CaptionTextIdentifier],
                                                          expItemDic[ELearningLabText.CalloutTextIdentifier], expItemDic[ELearningLabText.VoiceLabel],
                                                          expItemDic[ELearningLabText.CalloutIdentifier] == "Y", expItemDic[ELearningLabText.CaptionIdentifier] == "Y",
                                                          expItemDic[ELearningLabText.AudioIdentifier] == "Y", tagNo: Convert.ToInt32(expItemDic[ELearningLabText.TagNoIdentifier]));

            expItem.ClickNo      = Convert.ToInt32(expItemDic[ELearningLabText.ClickNumIdentifier]);
            expItem.TriggerIndex = expItemDic[ELearningLabText.TriggerOnClick] == "Y" ? (int)TriggerType.OnClick : (int)TriggerType.WithPrevious;
            if (expItem.IsDummyItem)
            {
                expItem.tagNo = SelfExplanationTagService.GenerateUniqueTag();
            }
            return(expItem);
        }
        private void AddExplanationItem(ClickItem reference, InsertItemAction action)
        {
            ExplanationItem selfExplanationClickItem = new ExplanationItem(captionText: string.Empty);

            selfExplanationClickItem.tagNo = SelfExplanationTagService.GenerateUniqueTag();
            int             index    = action(reference, selfExplanationClickItem);
            ExplanationItem template = Items.LastOrDefault(o => o is ExplanationItem &&
                                                           GetItemIndex(o) < index)
                                       as ExplanationItem;

            selfExplanationClickItem.CopyFormat(template);
            isSynced = false;
            UpdateClickNumAndTriggerInItems(useWorker: false, e: null);
            ScrollItemToView(selfExplanationClickItem);
        }
        private ObservableCollection <ClickItem> LoadItems(DoWorkEventArgs e)
        {
            DateTime start = DateTime.Now;

            SelfExplanationTagService.Clear();
            int clickNo = FirstClickNumber;
            ObservableCollection <ClickItem>    customItems      = new ObservableCollection <ClickItem>();
            ObservableCollection <ClickItem>    clickItems       = new ObservableCollection <ClickItem>();
            List <Dictionary <string, string> > explanationItems =
                ELearningLabTextStorageService.LoadSelfExplanationsFromSlide(slide);
            ClickItem customClickBlock;

            SelfExplanationTagService.PopulateTagNos(slide.GetShapesWithNameRegex(ELearningLabText.PPTLShapeNameRegex)
                                                     .Select(x => x.Name).ToList());
            HashSet <int>       tagNums  = new HashSet <int>();
            List <Effect>       effects  = slide.TimeLine.MainSequence.Cast <Effect>().ToList();
            int                 startIdx = 0;
            bool                hasReachedEndOfSequence = effects.Count == 0;
            List <CustomEffect> customEffects           = new List <CustomEffect>();
            List <ELLEffect>    pptlEffects             = new List <ELLEffect>();

            do
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return(clickItems);
                }
                customEffects = new List <CustomEffect>();
                for (int i = startIdx; i < effects.Count; i++)
                {
                    Effect effect = effects.ElementAt(i);
                    if (i > startIdx && effect.Timing.TriggerType == MsoAnimTriggerType.msoAnimTriggerOnPageClick)
                    {
                        startIdx = i;
                        break;
                    }
                    if (i == effects.Count - 1)
                    {
                        hasReachedEndOfSequence = true;
                    }
                    bool isPPTLEffect = SelfExplanationTagService.ExtractTagNo(effect.Shape.Name) != -1;
                    if (!isPPTLEffect)
                    {
                        customEffects.Add(new CustomEffect(effect.Shape.Name, effect.Shape.Id.ToString(),
                                                           EffectToAnimationTypeConverter.GetAnimationTypeOfEffect(effect)));
                    }
                }
                customClickBlock =
                    new CustomItemFactory(customEffects).GetBlock();
                if (customClickBlock != null)
                {
                    customClickBlock.ClickNo = clickNo;
                    customItems.Add(customClickBlock);
                }
                clickNo++;
            }while (startIdx <= effects.Count - 1 && !hasReachedEndOfSequence);

            while (explanationItems != null && explanationItems.Count > 0 && customItems.Count > 0)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return(clickItems);
                }
                Dictionary <string, string> expItemDic = explanationItems.First();
                ExplanationItem             expItem    = new ExplanationItem(expItemDic[ELearningLabText.CaptionTextIdentifier],
                                                                             expItemDic[ELearningLabText.CalloutTextIdentifier], expItemDic[ELearningLabText.VoiceLabel],
                                                                             expItemDic[ELearningLabText.CalloutIdentifier] == "Y", expItemDic[ELearningLabText.CaptionIdentifier] == "Y",
                                                                             expItemDic[ELearningLabText.AudioIdentifier] == "Y", tagNo: Convert.ToInt32(expItemDic[ELearningLabText.TagNoIdentifier]));
                expItem.ClickNo      = Convert.ToInt32(expItemDic[ELearningLabText.ClickNumIdentifier]);
                expItem.TriggerIndex = expItemDic[ELearningLabText.TriggerOnClick] == "Y" ? (int)TriggerType.OnClick : (int)TriggerType.WithPrevious;
                if (expItem.IsDummyItem)
                {
                    expItem.tagNo = SelfExplanationTagService.GenerateUniqueTag();
                }
                CustomItem customItem = customItems.ElementAt(0) as CustomItem;
                if (customItem.ClickNo <= expItem.ClickNo)
                {
                    clickItems.Add(customItem);
                    customItems.RemoveAt(0);
                }
                else
                {
                    clickItems.Add(expItem);
                    explanationItems.RemoveAt(0);
                }
            }
            while (explanationItems != null && explanationItems.Count > 0)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return(clickItems);
                }
                Dictionary <string, string> expItemDic = explanationItems.First();
                ExplanationItem             expItem    = new ExplanationItem(expItemDic[ELearningLabText.CaptionTextIdentifier],
                                                                             expItemDic[ELearningLabText.CalloutTextIdentifier], expItemDic[ELearningLabText.VoiceLabel],
                                                                             expItemDic[ELearningLabText.CalloutIdentifier] == "Y", expItemDic[ELearningLabText.CaptionIdentifier] == "Y",
                                                                             expItemDic[ELearningLabText.AudioIdentifier] == "Y", tagNo: Convert.ToInt32(expItemDic[ELearningLabText.TagNoIdentifier]));
                explanationItems.RemoveAt(0);
                clickItems.Add(expItem);
            }
            while (customItems.Count > 0)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return(clickItems);
                }
                CustomItem customItem = customItems.ElementAt(0) as CustomItem;
                customItems.RemoveAt(0);
                clickItems.Add(customItem);
            }
            return(clickItems);
        }