/// <summary>
 /// Выполняет загрузку презентации и дополнительных данных
 /// </summary>
 public void AssignPresentation(Presentation.Presentation APresentation, PresentationInfo APresentationInfo)
 {
     m_Presentation = APresentation;
     m_PresentationInfo = APresentationInfo;
     if (!DesignerClient.Instance.IsStandAlone)
     {
         SubscribeForMonitor(true);
     }
 }
        void PresentationNotifier_OnObjectChanged(object sender, NotifierEventArg<IList<ObjectInfo>> e)
        {
            if (e.Data != null)
            {
                foreach (ObjectInfo info in e.Data)
                {
                    if (!_identity.Equals(info.UserIdentity))
                    {
                        if (info.ObjectKey.GetObjectType() == ObjectType.Presentation)
                        {
                            if (m_Presentation.UniqueName == ((PresentationKey)info.ObjectKey).PresentationUniqueName && !PresentationLocked)
                            {
                                m_PresentationInfo = DesignerClient.Instance.PresentationWorker.GetPresentationInfo(m_Presentation.UniqueName);
                                Slide[] slides = GetLockedSlides();
                                m_Presentation = m_PresentationInfo.CreatePresentationStub();
                                //merge
                                foreach (Slide s in slides)
                                {
                                    Slide dest = m_Presentation.SlideList.Find(sl => sl.Id == s.Id);
                                    if (dest == null) continue;
                                    dest.SaveSlideLevelChanges(s);
                                    dest.IsLocked = s.IsLocked;
                                    dest.Cached = s.Cached;
                                    dest.State = s.State;
                                    //dest.SourceList.Clear();
                                    //dest.SourceList.AddRange(s.SourceList);
                                    //dest.DeviceList.Clear();
                                    //dest.DeviceList.AddRange(s.DeviceList);
                                    //dest.DisplayList.Clear();
                                    //dest.DisplayList.AddRange(s.DisplayList);
                                }

                                //update presentation
                                if (OnPresentationChangedExternally != null)
                                    OnPresentationChangedExternally();

                                continue;
                            }
                        }

                        if (info.ObjectKey.GetObjectType() == ObjectType.Slide)
                        {
                            string presentationUniqueName =
                                ((PresentationKey) ((SlideKey) info.ObjectKey).PresentationKey).PresentationUniqueName;
                            int slideId = ((SlideKey) info.ObjectKey).Id;
                            if (presentationUniqueName == this.m_Presentation.UniqueName)
                            {
                                Slide slide = m_Presentation.SlideList.FirstOrDefault(s => s.Id == ((SlideKey)info.ObjectKey).Id);
                                if (slide != null)
                                {
                                    slide.Cached = false;
                                    LoadSlide(slide);

                                    //refresh slide data
                                    if (OnSlideChangedExternally != null)
                                        OnSlideChangedExternally(slide);

                                    continue;
                                }
                            }
                        }
                    }
                }
            }
        }
        ///// <summary>
        ///// Фабрика сценария
        ///// </summary>
        //public static Presentation.Presentation NewPresentation(string AName, string authorName)
        //{
        //    Presentation.Presentation result = new Presentation.Presentation() { Name = AName, Author = authorName };
        //    Slide slide = new Slide { Id = 1, LabelId = -1, Name = "Сцена 1", Author = authorName, Modified = DateTime.Now, State = SlideState.New };
        //    result.SlideList.Add(slide);
        //    result.StartSlide = slide;

        //    return result;
        //}

        /// <summary>
        /// Фабрика сценария
        /// </summary>
        public static Presentation.Presentation NewPresentation(string AName, string authorName, int numberOfSlides)
        {
            Presentation.Presentation result = new Presentation.Presentation() { Name = AName, Author = authorName };
            DateTime now = DateTime.Now;
            for (int i = 1; i<=numberOfSlides; i++)
            {
                Slide slide = new Slide { Id = i, LabelId = -1, Name = string.Format("Сцена {0}", i), Author = authorName, Modified = now, State = SlideState.New };
                result.SlideList.Add(slide);
                if (i == 1) result.StartSlide = slide;
            }
            for (int i = 0; i < numberOfSlides - 1; i++ )
            {
                SlideLinkList list = new SlideLinkList();
                list.LinkList.Add(new Link() { IsDefault = true, NextSlide = result.SlideList[i+1]});
                result.LinkDictionary.Add(i + 1, list);
            }
            return result;
        }