Beispiel #1
0
        public IObjectContainer AddMasterPages(Stream stream)
        {
            CheckOpen();

            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            Serializer container = new Serializer();

            Serializer reader = new Serializer(stream);

            reader.ReadAllFromStream();

            foreach (MasterPage page in reader.MasterPageList)
            {
                if (reader.WorkingDirectoryGuid != _workingDirectoryGuid)
                {
                    // They are from different document.
                    foreach (Widget widget in page.Widgets)
                    {
                        widget.RebuildStyleChain(reader.GetWidgetBaseStyle(widget.Guid));
                    }
                }

                page.UpdateAllGuids();

                AddMasterPage(page);

                // Save page data to the working directory.
                page.Save();

                // Save embedded page data to the working directory.
                foreach (PageEmbeddedWidget embeddedWidget in page.Widgets.OfType <PageEmbeddedWidget>())
                {
                    foreach (EmbeddedPage embeddedPage in embeddedWidget.EmbeddedPages)
                    {
                        // Save embedded page.
                        embeddedPage.Save();
                    }
                }

                container.AddPageInternal(page);
            }

            return(container);
        }
Beispiel #2
0
        public IObjectContainer AddPages(Stream stream)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            CheckOpen();

            Serializer container = new Serializer();

            Serializer reader = new Serializer(stream);

            reader.ReadAllFromStream();

            List <IDocumentPage> pages = new List <IDocumentPage>();

            if (_documentData.DocumentType == DocumentType.Library)
            {
                pages.AddRange(reader.CustomObjectPageList);
            }
            else
            {
                pages.AddRange(reader.StandardPageList);
            }

            foreach (DocumentPage page in pages)
            {
                // They are from the different document
                if (reader.WorkingDirectoryGuid != _workingDirectoryGuid)
                {
                    List <IRegion> regionList = new List <IRegion>();
                    regionList.AddRange(page.Widgets);
                    regionList.AddRange(page.Masters);
                    List <IRegion> newOrderList = new List <IRegion>(regionList.OrderBy(x => x.RegionStyle.Z));

                    Dictionary <Guid, IObjectContainer> newTargets = new Dictionary <Guid, IObjectContainer>();

                    // Break away all masters
                    foreach (Master master in page.Masters)
                    {
                        IObjectContainer objects = reader.GetObjectsInAttachedMasterPage(master.MasterPageGuid);
                        newTargets[master.Guid] = objects;

                        // Update Guids as there may be many masters were created from the same master page.
                        Page.UpdateObjectGuids(objects);

                        Group parentGroup = master.ParentGroup as Group;
                        if (parentGroup != null)
                        {
                            // Remove this master from its parent group.
                            parentGroup.RemoveMaster(master);
                        }

                        // Ajust broken away widgets location
                        double deltaX = master.MasterStyle.X;
                        double deltaY = master.MasterStyle.Y;

                        // Replace master with its broken widgets.
                        int masterIndex = newOrderList.IndexOf(master);
                        newOrderList.InsertRange(masterIndex, objects.WidgetList);
                        newOrderList.Remove(master);

                        foreach (Widget widget in objects.WidgetList)
                        {
                            if (!page.PageData.Widgets.Contains(widget.Guid))
                            {
                                page.PageData.Widgets.Add(widget.Guid, widget);

                                widget.ParentPage = page; // Set parent page.

                                if (widget.ParentGroup == null && parentGroup != null)
                                {
                                    // Add widget created by breaking master away to parent group if it is not in a group.
                                    parentGroup.AddWidget(widget);
                                }

                                widget.WidgetStyle.X += deltaX;
                                widget.WidgetStyle.Y += deltaY;
                            }
                        }

                        foreach (Group group in objects.GroupList)
                        {
                            if (!page.PageData.Groups.Contains(group.Guid))
                            {
                                page.PageData.Groups.Add(group.Guid, group);

                                group.ParentPage = page;

                                if (group.ParentGroup == null && parentGroup != null)
                                {
                                    // Add group created by breaking master away to parent group.
                                    parentGroup.AddGroup(group);
                                }
                            }
                        }
                    }

                    foreach (Widget widget in page.Widgets)
                    {
                        // Rebuild widget base style
                        widget.RebuildStyleChain(reader.GetWidgetBaseStyle(widget.Guid));

                        // Update action which has the master as a target.
                        widget.UpdateActions(newTargets);
                    }

                    // Delete all masters
                    page.DeleteAllMasters();

                    // Reset all widgets Zorder
                    int index = 0;
                    foreach (Widget widget in newOrderList)
                    {
                        widget.WidgetStyle.Z = index;
                        index++;
                    }
                }

                // Update all guids in this new page.
                page.UpdateAllGuids();

                // Add this page to the document.
                AddPage(page);

                // Save embedded page data to the working directory.
                foreach (PageEmbeddedWidget embeddedWidget in page.Widgets.OfType <PageEmbeddedWidget>())
                {
                    foreach (EmbeddedPage embeddedPage in embeddedWidget.EmbeddedPages)
                    {
                        // Save embedded page and close it.
                        embeddedPage.Close();
                    }
                }

                // Save page data to the working directory and close it.
                page.Close();

                container.AddPageInternal(page);
            }

            return(container);
        }