private void tagNameEditBox_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            RemovableTagModel mdl = DataContext as RemovableTagModel;

            if (e.Key == System.Windows.Input.Key.Escape)
            {
                e.Handled = true;
                HideConfirmation();
                DisableEditing();
            }
        }
        private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            RemovableTag t = sender as RemovableTag;

            RemovableTagModel mdl = t.DataContext as RemovableTagModel;

            if (mdl != null)
            {
                mdl.PropertyChanged += mdl_PropertyChanged;
                mdl_PropertyChanged(mdl, RemovableTagModel.HIGHLIGHTED_TAGNAME);
            }
        }
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            MenuItem          itm = sender as MenuItem;
            RemovableTagModel mdl = DataContext as RemovableTagModel;

            switch (itm.Tag.ToString())
            {
            case "DeleteTag":
                Tag = itm.Tag;
                if (mdl.CanRemove)
                {
                    RaiseEvent(new RoutedEventArgs(ActionEvent, this));
                }
                else
                {
                    ShowConfirmation();
                    actionMenu.IsSubmenuOpen = true;
                }
                break;

            case "RenameTag":
                Tag = itm.Tag;
                EnableEditing();
                ShowConfirmation();
                break;

            case "CancelAction":
                HideConfirmation();
                DisableEditing();
                break;

            case "ConfirmAction":
                HideConfirmation();
                DisableEditing();
                if (!"RenameTag".Equals(itm.Tag) || mdl.LocalName.Equals(mdl.TagName, StringComparison.CurrentCultureIgnoreCase))
                {
                    RaiseEvent(new RoutedEventArgs(ActionEvent, this));
                }

                break;
            }
        }
        private void mdl_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            RemovableTagModel mdl = sender as RemovableTagModel;

            if (mdl != null)
            {
                if (e == RemovableTagModel.HIGHLIGHTED_TAGNAME)
                {
                    highlighedTag.Inlines.Clear();
                    highlighedTag.Inlines.AddRange(mdl.HighlightedTagName.Select((f) =>
                    {
                        Run r = new Run(f.Text);
                        if (f.IsMatch)
                        {
                            r.Background = Brushes.Yellow;
                        }
                        return(r);
                    }));
                }
            }
        }
        /// <summary>
        /// Remove or rename tag from suggestions when user control is tapped.
        /// </summary>
        /// <param name="sender">user control emitting this event</param>
        /// <param name="e">     event details</param>
        private void Tag_Action(object sender, RoutedEventArgs e)
        {
            var rt     = sender as RemovableTag;
            var rt_mdl = rt.DataContext as RemovableTagModel;

            string[] toRemove = new string[] { rt_mdl.Key };
            if ("DeleteTag".Equals(rt.Tag))
            {
                _model.SuggestedTags.RemoveAll(toRemove);
                // schedule all pages with this tag for tag removal
                if (rt_mdl.Tag != null)
                {
                    foreach (var tp in rt_mdl.Tag.Pages)
                    {
                        _model.OneNoteApp.TaggingService.Add(new TaggingJob(tp.ID, toRemove, TagOperation.SUBTRACT));
                    }
                    suggestedTags.Notification = rt_mdl.Tag.Pages.Count == 0 ? Properties.Resources.TagEditor_Popup_NothingTagged : string.Format(Properties.Resources.TagEditor_Popup_TaggingInProgress, rt_mdl.Tag.Pages.Count);
                    TraceLogger.Log(TraceCategory.Info(), "{0} page(s) enqueued for background tagging; Operation SUBTRACT {1}", rt_mdl.Tag.Pages.Count, toRemove[0]);
                }
                else
                {
                    suggestedTags.Notification = Properties.Resources.TagEditor_Popup_NothingTagged;
                }
            }
            else if ("RenameTag".Equals(rt.Tag))
            {
                _model.SuggestedTags.RemoveAll(toRemove);

                string[] newTagNames = (from tn in OneNotePageProxy.ParseTags(rt_mdl.LocalName) select TagFormatter.Format(tn)).ToArray();

                // create new tag models unless they already exist
                List <RemovableTagModel> newTagModels = new List <RemovableTagModel>();
                foreach (var newName in newTagNames)
                {
                    RemovableTagModel tagmodel;
                    if (!_model.SuggestedTags.TryGetValue(newName, out tagmodel))
                    {
                        tagmodel = new RemovableTagModel()
                        {
                            Tag = new TagPageSet(newName)
                        };
                        newTagModels.Add(tagmodel);
                    }
                    else if (tagmodel.Tag == null && rt_mdl.Tag != null)
                    {
                        tagmodel.Tag = new TagPageSet(newName);
                    }

                    if (rt_mdl.Tag != null)
                    {
                        // copy the pages into the new tag and update the tag count
                        foreach (var pg in rt_mdl.Tag.Pages)
                        {
                            tagmodel.Tag.Pages.Add(pg);
                        }
                        tagmodel.UseCount = tagmodel.Tag.Pages.Count;
                    }
                }
                _model.SuggestedTags.AddAll(newTagModels);

                if (rt_mdl.Tag != null)
                {
                    // remove the old tag and add new tag to the pages
                    foreach (var tp in rt_mdl.Tag.Pages)
                    {
                        _model.OneNoteApp.TaggingService.Add(new TaggingJob(tp.ID, toRemove, TagOperation.SUBTRACT));
                        _model.OneNoteApp.TaggingService.Add(new TaggingJob(tp.ID, newTagNames, TagOperation.UNITE));
                    }
                    suggestedTags.Notification = rt_mdl.Tag.Pages.Count == 0 ? Properties.Resources.TagEditor_Popup_NothingTagged : string.Format(Properties.Resources.TagEditor_Popup_TaggingInProgress, rt_mdl.Tag.Pages.Count);
                    TraceLogger.Log(TraceCategory.Info(), "{0} page(s) enqueued for background tagging; Operation UNITE {1} SUBTRACT {2}", rt_mdl.Tag.Pages.Count, string.Join(",", newTagNames), toRemove[0]);
                }
                else
                {
                    suggestedTags.Notification = Properties.Resources.TagEditor_Popup_NothingTagged;
                }
            }
            TraceLogger.Flush();
            _model.SaveChanges();
        }