Пример #1
0
        void LoadLayout(SlideLayout layout)
        {
            internalChanging = true;
            Model.HistoryManager.Pause();
            Model.Clear();
            View.Origin = new PointF(0, 0);
            LoadBackground(layout);
            if (layout != null && !layout.IsEmpty)
            {
                if (layout.Slide.SourceList.Count > 0)
                    PresentationController.Instance.SourceID = new Identity(layout.Slide.SourceList.Max(s => Int32.Parse(s.Id)));
                else
                    PresentationController.Instance.SourceID = new Identity(0);

                Display display = layout.Display;
                this.Model.DocumentSize = new PageSize(display.Width, MeasureUnits.Pixel, display.Height, MeasureUnits.Pixel);

                float width = ((Control)Viewer).Width;
                float height = ((Control)Viewer).Height;

                this.View.Magnification = Math.Min((width - 40f) / (float)display.Width, (height - 40f) / (float)display.Height) * 100f;

                Model.BeginUpdate();
                SourceWindow last = null;
                foreach (Window w in display.WindowList.OrderBy(wnd => wnd.ZOrder))
                {
                    SourceWindow window;

                    if (w.Source != null && w.Source.ResourceDescriptor != null)
                    {
                        window = new SourceWindow(w);
                        // Для пассивного односгемнтного дисплея нельзя изменить положение окна источника на раскладке
                        ISegmentationSupport segmentSupport = display as ISegmentationSupport;
                        bool allowResize = true;
                        if ((display is PassiveDisplay) &&
                            (segmentSupport == null || (segmentSupport.SegmentColumns == 1 && segmentSupport.SegmentRows == 1)))
                            allowResize = false;

                        window.EditStyle.AllowChangeHeight = allowResize;
                        window.EditStyle.AllowChangeWidth = allowResize;
                        window.EditStyle.AllowMoveX = allowResize;
                        window.EditStyle.AllowMoveY = allowResize;

                        Model.SetZOrder(window, w.ZOrder);
                    }
                    else
                    {
                        continue;
                    }
                    Model.AppendChild(window);
                    last = window;
                    if (last != null) ProvideReferenceFor(last);
                }
                Model.EndUpdate();
                PresentationController.Instance.SendOnSelectedResourceChanged(last);
            }

            internalChanging = false;
            Model.HistoryManager.Resume();
        }
Пример #2
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);
        }
Пример #3
0
        private void LoadBackground(SlideLayout layout)
        {
            string imId = null;
            int x = -1; int y = -1;
            //download the background image
            if (layout != null)
            {
                if (layout.Display is ActiveDisplay)
                {
                    string id = ((ActiveDisplay)layout.Display).BackgroundImage;
                    if (!String.IsNullOrEmpty(id))
                    {
                        x = layout.Display.Size.X;
                        y = layout.Display.Size.Y;
                        if (backgrounds.ContainsKey(id))
                        {
                            BackgroundImageDescriptor bid = backgrounds[id];
                            imId = GetFile(bid);
                        }
                    }
                }
            }

            backProvider.SetBackgroundImage(imId, this.View as IBackgroundSupport, x, y);
            ((Control)(this.Viewer)).Invalidate();

        }
Пример #4
0
        void Instance_OnSlideLayoutChanged(SlideLayout NewSlideLayout)
        {
            SaveWindows();

            MethodInvoker i = new MethodInvoker(() =>
                {
                    if (NewSlideLayout != null)
                        _slideLocked = PresentationController.Instance.CanUnlockSlide(NewSlideLayout.Slide);
                    bool _isEmpty = NewSlideLayout == null || NewSlideLayout.IsEmpty;
                    if (CanEdit)
                        _view.ReadOnly = _isEmpty;
                    else
                        _view.ReadOnly = true;

                    LoadLayout(NewSlideLayout);
                    CurrentLayout = NewSlideLayout;
                });

            if (_view.IsHandleCreated)
            {
                _view.Invoke(i);
            }
            else
            {
                i.Invoke();
            }
        }
Пример #5
0
        public void ExcludeFromGroup(DisplayNode node)
        {
            if (node.Parent != null)
            {
                DisplayGroupNode groupNode = node.Parent as DisplayGroupNode;
                if (groupNode != null)
                {
                    groupNode.DisplayGroup.DisplayNameList.Remove(node.Display.Type.Name);
                    PresentationController.Instance.CurrentSlideLayout.RemoveFromLayout(node.Display);
                    foreach (Slide slide in PresentationController.Instance.GetAllSlides()
                        .Where(sld=> !sld.Name.Equals(PresentationController.Instance.CurrentSlideLayout.Slide.Name)))
                    {
                        IEnumerable<Display> displs = slide.DisplayList.Where(dsp => groupNode.DisplayGroup.DisplayNameList.Contains(dsp.Type.Name));
                        SlideLayout sltemp = new SlideLayout(displs, slide);
                        sltemp.RemoveFromLayout(node.Display);
                    }
                    PresentationController.Instance.PresentationChanged = true;
                    if (groupNode.DisplayGroup.DisplayNameList.Count == 0)
                    {
                        groupNode.DisplayGroup.Width = 0;
                        groupNode.DisplayGroup.Height = 0;
                        groupNode.DisplayGroup.Type = String.Empty;

                        groupNode.OpenImgIndex = 1;
                        groupNode.NoChildrenImgIndex = 0;
                    }

                    node.Display.DisplayGroup = null;
                }
            }
        }
Пример #6
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;
        }
Пример #7
0
        private void PerformChangeLayout()
        {
            _layout = null;
            if (SelectedSlide != null)
            {
                if (_selectedDisplay != null)
                    _layout = new SlideLayout(new Display[] { _selectedDisplay }, SelectedSlide);
                else
                {
                    if (_selectedDisplayGroup != null)
                        _layout = new SlideLayout(_selectedDisplayGroup, SelectedSlide);
                }
            }

            if (OnSlideLayoutChanged != null && !SuppressLayoutChanging)
                OnSlideLayoutChanged(_layout);
        }