Esempio n. 1
0
        public void ShowBackgroundProps()
        {
            if (CurrentLayout.Display is ActiveDisplay)
            {
                Guid dsoGuid = new Guid("00460182-9E5E-11d5-B7C8-B8269041DD57");
                string keyName = @"CLSID\{" + dsoGuid + "}";
                using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(keyName))
                    if (key == null)
                    {
                        MessageBoxExt.Show(
                            "В системе не установлен DSO компонент необходимый для просмотра",
                            "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                string b_id = ((ActiveDisplay)(CurrentLayout.Display)).BackgroundImage;
                try
                {
                    using (PowerPointForm frm = new PowerPointForm(CurrentLayout.Display.Width, CurrentLayout.Display.Height))
                    {
                        if (String.IsNullOrEmpty(b_id) || backgrounds.ContainsKey(b_id) == false)
                            frm.CreateDocument();
                        else
                        {
                            // прежде чем брать путь - обязательно закачаем ресурс
                            //string fName = DesignerClient.Instance.PresentationWorker.SourceDAL.GetResourceFileName(backgrounds[b_id]);
                            string fName = GetFile(backgrounds[b_id]);
                            if (string.IsNullOrEmpty(fName))
                            {
                                MessageBoxExt.Show(
                                    "Фоновый файл не удалось закачать с сервера",
                                    "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                            frm.AssignDocument(fName);
                        }

                        frm.ShowDialog();

                        if (frm.Changed)
                        {
                            DialogResult result = DialogResult.None;
                            if (!DesignerClient.Instance.IsStandAlone)
                            {
                                string userName = string.IsNullOrEmpty(PresentationController.Instance.UserIdentity.User.FullName) ?
                                    PresentationController.Instance.UserIdentity.User.Name :
                                    PresentationController.Instance.UserIdentity.User.FullName;
                                result = MessageBoxExt.Show
                                    (null, String.Format("Применить изменения фона для всех раскладок дисплея \"{0}\" на всех сценах сценария, заблокированных пользователем {1}?", CurrentLayout.Display.Type.Name, userName),
                                    Properties.Resources.Confirmation, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, new string[] { "Да", "Нет" }, false);
                            }
                            else
                            {
                                result = MessageBoxExt.Show(null, String.Format("Применить изменения фона для всех раскладок дисплея \"{0}\" на всех сценах сценария?", CurrentLayout.Display.Type.Name), Properties.Resources.Confirmation, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, new string[] { "Да", "Нет" }, false);
                            }

                            BackgroundImageDescriptor descr = new BackgroundImageDescriptor(frm.DocumentPath, m_presentation.UniqueName);
                            descr.IsLocal = true;

                            createSourceThread = new Thread(new ThreadStart(new MethodInvoker(() =>
                            {
                                if (CreateBackgroundResource(descr))
                                {
                                    string id = descr.ResourceInfo.Id;
                                    backgrounds.Add(id, descr);
                                    List<Display> selected = new List<Display>();
                                    if (PresentationController.Instance.SelectedDisplay != null)
                                        selected.Add(PresentationController.Instance.SelectedDisplay);
                                    else
                                        selected.AddRange(PresentationController.Instance.SelectedDisplayGroup);
                                    Size<int> sizeDisplayes = selected[0].Size;
                                    if (result != DialogResult.OK)
                                    {
                                        foreach (Display item in selected)
                                            CurrentLayout.ApplyDisplayBackground(id, item);
                                    }
                                    else
                                    {
                                        foreach (Slide slide in PresentationController.Instance.GetAllSlides())
                                            if (DesignerClient.Instance.IsStandAlone || (slide.IsLocked && PresentationController.Instance.CanUnlockSlide(slide)))
                                            {
                                                //SV: если блокировку проводили до выделения дисплея, то он попал только в последний текущий слайд
                                                //а нам надо добавить его во все заблокированнные
                                                foreach (Display item in selected)
                                                {
                                                    if (!slide.DisplayList.Contains(item))
                                                    {
                                                        SlideLayout sltemp = new SlideLayout(slide.DisplayList, slide);
                                                        sltemp.AppendToLayout(item, true);
                                                    }
                                                    //SV: End
                                                    SlideLayout.ApplyDisplayBackground(slide, id, item);
                                                }
                                            }
                                    }

                                    ((Control)this.Viewer).Invoke(new MethodInvoker(() => LoadBackground(CurrentLayout)));
                                    PresentationController.Instance.PresentationChanged = true;
                                    // удаляем временный файл
                                    //string tempPath = ((ResourceFileInfo) descr.ResourceInfo).ResourceFullFileName;
                                    //try
                                    //{
                                    //    File.Delete(tempPath);
                                    //}
                                    //catch{}
                                }
                            })));

                            createSourceThread.IsBackground = true;
                            createSourceThread.SetApartmentState(ApartmentState.STA);
                            createSourceThread.Start();

                            //if (CreateBackgroundResource(descr))
                            //{
                            //    string id = descr.ResourceInfo.Id;
                            //    backgrounds.Add(id, descr);
                            //    List<Display> selected = new List<Display>();
                            //    if (PresentationController.Instance.SelectedDisplay != null)
                            //        selected.Add(PresentationController.Instance.SelectedDisplay);
                            //    else
                            //        selected.AddRange(PresentationController.Instance.SelectedDisplayGroup);
                            //    Size<int> sizeDisplayes = selected[0].Size;
                            //    if (result != DialogResult.OK)
                            //    {
                            //        foreach (Display item in selected)
                            //            CurrentLayout.ApplyDisplayBackground(id, item);
                            //    }
                            //    else
                            //    {
                            //        foreach (Slide slide in PresentationController.Instance.GetAllSlides())
                            //            if (DesignerClient.Instance.IsStandAlone || (slide.IsLocked && PresentationController.Instance.CanUnlockSlide(slide)))
                            //            {
                            //                //SV: если блокировку проводили до выделения дисплея, то он попал только в последний текущий слайд
                            //                //а нам надо добавить его во все заблокированнные
                            //                foreach (Display item in selected)
                            //                {
                            //                    if (!slide.DisplayList.Contains(item))
                            //                    {
                            //                        SlideLayout sltemp = new SlideLayout(slide.DisplayList, slide);
                            //                        sltemp.AppendToLayout(item, true);
                            //                    }
                            //                    //SV: End
                            //                    SlideLayout.ApplyDisplayBackground(slide, id, item);
                            //                }
                            //            }
                            //    }

                            //    ((Control)this.Viewer).Invoke(new MethodInvoker(() =>
                            //    {
                            //        backProvider.SetBackgroundImage(frm.DocumentPath, this.View as IBackgroundSupport, sizeDisplayes.X, sizeDisplayes.Y);
                            //        ((Control)(this.Viewer)).Invalidate();
                            //    }));
                            //    PresentationController.Instance.PresentationChanged = true;
                            //}
                        }
                    }
                }
                catch (Exception ex)
                {
                    //if (ex is COMException || 
                    //    ((ex is TargetInvocationException) && (ex.InnerException is COMException)))
                    MessageBoxExt.Show(String.Format("Произошла ошибка при открытии формы. Возможно подложка была создана в другой версии PowerPoint{0}Детальная информация:{0}{1}", Environment.NewLine, ex.Message),
                        "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
                MessageBoxExt.Show("Тип выбранного дисплея не поддерживает редактирование подложки", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
Esempio n. 2
0
        public bool AddDisplayToGroup(DisplayGroup displayGroup, Display display)
        {
            ISegmentationSupport s = display as ISegmentationSupport;

            if (s != null && (s.SegmentColumns > 1 || s.SegmentRows > 1))
            {
                MessageBoxExt.Show("Многосегментный дисплей не может быть помещен в группу", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }

            List<Slide> changedSlides = new List<Slide>();

            bool clear = false;
            if (displayGroup.DisplayNameList.Count == 0)
            {
                displayGroup.Width = display.Width;
                displayGroup.Height = display.Height;
                displayGroup.Type = display.Type.Type;
                display.DisplayGroup = displayGroup.Name;
                PresentationController.Instance.PresentationChanged = true;
            }
            else
            {
                if (display.Width == displayGroup.Width && display.Height == displayGroup.Height && display.Type.Type == displayGroup.Type)
                {
                    if (displayGroup.DisplayNameList.Contains(display.Type.Name))
                        return false;

                    if (!SlideGraphController.Instance.SaveNewSlides("Имеются несохраненные сцены.\r\nДля продолжения необходимо сохранить изменения.\r\nСохранить новые сцены?"))
                        return false;

                    //https://sentinel2.luxoft.com/sen/issues/browse/PMEDIAINFOVISDEV-861
                    //Если хотя бы одна сцена в сценарии заблокирована другим пользователем, то при попытке поместить дисплей в непустую группу дисплеев, система должна выводить сообщение: «Перемещение дисплея <Название дисплея> в группу <Название группы> невозможно: в сценарии есть заблокированные сцены. Для перемещения дисплея в непустую группу необходимо разблокировать все сцены.» (кнопка «ОК»)
                    //Display anyDisplay = DisplayByGroup(displayGroup).First();
                    foreach (Slide slide in PresentationController.Instance.GetAllSlides())
                    {
                        // НЕ проверяем сцены для которых есть непустая раскладка как на дисплее из группы итак и для дисплея который перемещается в группу
                        //if (SlideLayout.GetWindowsCount(anyDisplay, slide) > 0 || SlideLayout.GetWindowsCount(display, slide) > 0)
                        {
                            changedSlides.Add(slide);
                            LockingInfo lockingInfo = PresentationController.Instance.GetSlideLockingInfo(slide);
                            if (lockingInfo != null && !lockingInfo.UserIdentity.Equals(PresentationController.Instance.UserIdentity))
                            {
                                MessageBoxExt.Show(
                                    string.Format(
                                        "Перемещение дисплея {0} в группу {1} невозможно: в сценарии есть заблокированные сцены. Для перемещения дисплея в непустую группу необходимо разблокировать все сцены.",
                                        display.Name, displayGroup.Name),
                                    "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                return false;
                            }
                        }
                    }

                    Slide[] allSlides = PresentationController.Instance.GetAllSlides();
                    for (int i = 0; i < allSlides.Length; i++)
                    {
                        if (SlideLayout.GetWindowsCount(display, allSlides[i]) > 0)
                        {
                            if (MessageBoxExt.Show(String.Format("У дисплея {0} есть настроенные раскладки сцен.\r\nПри перемещении дисплея ему будут установлены раскладки группы {1}?", display.Type.Name, displayGroup.Name), "Внимание", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, new string[] { "Продолжить", "Отмена" }) == DialogResult.Cancel)
                                return false;
                            clear = true;
                            break;
                        }
                    }
                    // Это не работает, если выделена пустая сцена. Поэтому написан код выше.
                    //if (SlideLayout.GetWindowsCount(display, PresentationController.Instance.SelectedSlide) > 0)
                    //{
                    //    if (MessageBoxExt.Show(String.Format("У дисплея {0} есть настроенные раскладки сцен.\r\nПри перемещении дисплея ему будут установлены раскладки группы {1}?", display.Type.Name, displayGroup.Name), "Внимание", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, new string[] { "Продолжить", "Отмена" }) == DialogResult.Cancel)
                    //        return false;

                    //    clear = true;
                    //}

                    display.DisplayGroup = displayGroup.Name;
                    PresentationController.Instance.PresentationChanged = true;
                }
                else
                {
                    MessageBoxExt.Show(String.Format("Разрешение/тип {0} отличаются от разрешения/типа {1}.\r\nПеремещение дисплея в группу невозможно", displayGroup.Name, display.Name), "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            bool isSuccess = true;
            List<Display> displayList = DisplayByGroup(displayGroup);
            List<Slide> lockedSlides = new List<Slide>(changedSlides.Count);
            // если все прошло успешно, то теперь для слайдов в changedSlides мы должны нефвно залочить, сохранить и разлочить
            foreach (Slide slide in changedSlides)
            {
                LockingInfo lockingInfo = PresentationController.Instance.GetSlideLockingInfo(slide);
                if (!(lockingInfo != null && lockingInfo.UserIdentity.Equals(PresentationController.Instance.UserIdentity)))
                {
                    if (!PresentationController.Instance.LockSlide(slide))
                    {
                        MessageBoxExt.Show(
                            string.Format(
                                "Перемещение дисплея {0} в группу {1} невозможно: в сценарии есть заблокированные сцены. Для перемещения дисплея в непустую группу необходимо разблокировать все сцены.",
                                display.Name, displayGroup.Name),
                            "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        isSuccess = false;
                        break;
                    }
                    else
                    {
                        lockedSlides.Add(slide);
                    }
                }
            }

            if (isSuccess)
            {
                foreach (Slide slide in changedSlides)
                {
                    SlideLayout sltemp = new SlideLayout(displayList, slide);
                    sltemp.AppendToLayout(display, clear);
                    if (displayList.Count > 0)
                    {
                        Display firstDisplay = slide.DisplayList.First(src => src.Equals(displayList[0]));
                        if (firstDisplay is ActiveDisplay)
                        {
                            string id = ((ActiveDisplay)firstDisplay).BackgroundImage;
                            if (!string.IsNullOrEmpty(id))
                                SlideLayout.ApplyDisplayBackground(slide, id, display);
                        }
                    }
                }
                displayGroup.DisplayNameList.Add(display.Type.Name);
                //PresentationController.Instance.SaveSlideChanges(lockedSlides.ToArray());
                PresentationController.Instance.SavePresentation();
            }
            foreach (Slide slide in lockedSlides)
            {
                PresentationController.Instance.UnlockSlide(slide);
            }
            if (!isSuccess) return false;

            //SlideLayout sl = new SlideLayout(displayList, PresentationController.Instance.SelectedSlide);
            //sl.AppendToLayout(display, clear);

            return true;
        }