public CreatePresentationResult CreatePresentation(UserIdentity sender,
            PresentationInfo presentationInfo,
            out int[] labelNotExists)
        {
            labelNotExists = presentationInfo.GetUsedLabels().Except(
                _configuration.LabelStorageAdapter.GetLabelStorage().Select(lb => lb.Id)).ToArray();
            if (labelNotExists.Length != 0) return CreatePresentationResult.LabelNotExists;
            if (null != _presentationDAL.GetPresentationInfo(presentationInfo.UniqueName)) return CreatePresentationResult.SameUniqueNameExists;
            if (null != _presentationDAL.GetPresentationInfoByPresentationName(presentationInfo.Name))
                return CreatePresentationResult.SameNameExists;

            bool isSuccess = _presentationDAL.SavePresentation(sender,
                                                     presentationInfo.CreatePresentationStub());
            if (isSuccess) return CreatePresentationResult.Ok;
            else return CreatePresentationResult.SameNameExists;
        }
        public PresentationDesignerForm(PresentationInfo aPresentationInfo)
        {
            m_PresentationInfo = aPresentationInfo;
            m_Presentation = aPresentationInfo.CreatePresentationStub();
            PresentationController.CreatePresentationController();
            PresentationController.Instance.PresentationChanged = false;
            PresentationChanged = new Changed(() =>
            {
                this.saveMenuButton.Enabled = PresentationController.Instance.PresentationChanged;
                this.savePresentationToolButton.Enabled = PresentationController.Instance.PresentationChanged;
                this.ChangedStatus.Visible = PresentationController.Instance.PresentationChanged;
                this.ChangedStatus.Text = PresentationController.Instance.ChangedTextStatus;
            });
            PresentationController.Instance.OnChanged += PresentationChanged;
            PresentationController.Instance.OnPresentationLockChanged += new PresentationLockChanged(Instance_OnPresentationLockChanged);
            PresentationController.Instance.OnPresentationRemoved += new Changed(Instance_OnPresentationRemoved);
            PresentationController.Instance.OnPresentationLockedExternally += new PresentationLockedExternally(Instance_OnPresentationLockedExternally);
            PresentationController.Instance.OnPresentationUnlockedExternally += new PresentationUnlockedExternally(Instance_OnPresentationUnlockedExternally);
            PresentationController.Instance.OnSlideSelectionChanged += new SlideSelectionChanged(Instance_OnSlideSelectionChanged);
            PresentationController.Instance.OnOtherUserLockForShow += new SlideChanged(Instance_OnOtherUserLockForShow);
            UndoService.CreateUndoService();
            PresentationController.Instance.AssignPresentation(m_Presentation, m_PresentationInfo);
            InitializeComponent();

            RefreshTitle();
            this.statusStrip.ContextMenuStrip = null;
            this.ChangedStatus.Visible = false;

            this.WindowState = FormWindowState.Maximized;
            UndoService.Instance.OnHistoryChanged += new HistoryChanged(OnHistoryChanged);

            identity = Thread.CurrentPrincipal as UserIdentity;
            slideDiagram.SwitchPlayerMode(false);

            toolStripEx2.Enabled = false;
            PresentationController.Instance.RefreshLockingInfo();


            LockingInfo li = ((PresentationInfoExt)m_PresentationInfo).LockingInfo;
            if (li != null)
            {
                string info = String.Format(lockedByUser, 
                    string.IsNullOrEmpty(li.UserIdentity.User.FullName) ? li.UserIdentity.User.Name : li.UserIdentity.User.FullName,
                    li.RequireLock == RequireLock.ForShow ? "для показа" :  "для редактирования");
                this.LockingStatus.Visible = true;
                this.LockingStatus.Text = info;
                if (li.RequireLock == RequireLock.ForShow)
                {
                    layoutPreviewMenuButton.Enabled = false;
                    previewToolButton.Enabled = false;
                }
            }

            if (layoutPreviewMenuButton.Enabled || previewToolButton.Enabled)
            {
                layoutPreviewMenuButton.Enabled = previewToolButton.Enabled = !LayoutController.Instance.IsShownByPlayer();
            }

            SlideGraphController.Instance.OnSlideHover += new EventHandler<SlideEventArgs>(Instance_OnSlideHover);

            updateMenuButton.Enabled = !DesignerClient.Instance.IsStandAlone;
            refreshDisplayMenuButton.Enabled = !DesignerClient.Instance.IsStandAlone;
            refreshSlidesMenuButton.Enabled = !DesignerClient.Instance.IsStandAlone;
            commonSourcesRefreshMenuButton.Enabled = !DesignerClient.Instance.IsStandAlone;
            equipmentRefreshMenuButton.Enabled = !DesignerClient.Instance.IsStandAlone;
            toXmlMenuButton.Enabled = !DesignerClient.Instance.IsStandAlone;

            LayoutController.Instance.OnShownStatusChanged += new Action<bool>(Instance_OnShownStatusChanged);
            layoutPreviewMenuButton.Visible = previewToolButton.Visible = !DesignerClient.Instance.IsStandAlone;
        }
        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;
                                }
                            }
                        }
                    }
                }
            }
        }