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(); }
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); }
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(); }
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(); } }
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; } } }
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; }
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); }