/// <summary>Writes PDF for specified auto-doc commands.</summary> /// <param name="section">The writer to write to.</param> /// <param name="tags">The autodoc tags.</param> private void TagsToMigraDoc(Section section, List <AutoDocumentation.ITag> tags) { int figureNumber = 0; foreach (AutoDocumentation.ITag tag in tags) { if (tag is AutoDocumentation.Heading) { AutoDocumentation.Heading heading = tag as AutoDocumentation.Heading; if (heading.headingLevel > 0 && heading.headingLevel <= 6) { Paragraph para = section.AddParagraph(heading.text, "Heading" + heading.headingLevel); para.Format.KeepWithNext = true; int posSpace = heading.text.IndexOf(' '); if (posSpace > 0) { para.AddBookmark(heading.text.Substring(posSpace + 1)); } if (heading.headingLevel == 1) { para.Format.OutlineLevel = OutlineLevel.Level1; } else if (heading.headingLevel == 2) { para.Format.OutlineLevel = OutlineLevel.Level2; } else if (heading.headingLevel == 3) { para.Format.OutlineLevel = OutlineLevel.Level3; } else if (heading.headingLevel == 4) { para.Format.OutlineLevel = OutlineLevel.Level4; } else if (heading.headingLevel == 5) { para.Format.OutlineLevel = OutlineLevel.Level5; } else if (heading.headingLevel == 6) { para.Format.OutlineLevel = OutlineLevel.Level6; } } } else if (tag is AutoDocumentation.Paragraph) { AutoDocumentation.Paragraph paragraph = tag as AutoDocumentation.Paragraph; if (paragraph.text.Contains("![Alt Text]")) { figureNumber++; } paragraph.text = paragraph.text.Replace("[FigureNumber]", figureNumber.ToString()); AddFormattedParagraphToSection(section, paragraph); } else if (tag is AutoDocumentation.GraphAndTable) { CreateGraphPDF(section, tag as AutoDocumentation.GraphAndTable); } else if (tag is GraphPage) { CreateGraphPage(section, tag as GraphPage); } else if (tag is AutoDocumentation.NewPage) { section.AddPageBreak(); if ((tag as AutoDocumentation.NewPage).Portrait) { section.PageSetup.Orientation = Orientation.Portrait; } else { section.PageSetup.Orientation = Orientation.Landscape; } } else if (tag is AutoDocumentation.PageSetup) { if ((tag as AutoDocumentation.PageSetup).Portrait) { section.PageSetup.Orientation = Orientation.Portrait; } else { section.PageSetup.Orientation = Orientation.Landscape; } } else if (tag is AutoDocumentation.Table) { CreateTable(section, tag as AutoDocumentation.Table); } else if (tag is Graph) { GraphPresenter graphPresenter = new GraphPresenter(); explorerPresenter.ApsimXFile.Links.Resolve(graphPresenter); GraphView graphView = new GraphView(); graphView.BackColor = OxyPlot.OxyColors.White; graphView.ForegroundColour = OxyPlot.OxyColors.Black; graphView.FontSize = 12; graphView.Width = 500; graphView.Height = 500; graphPresenter.Attach(tag, graphView, explorerPresenter); string pngFileName = graphPresenter.ExportToPNG(WorkingDirectory); section.AddResizeImage(pngFileName); string caption = (tag as Graph).Caption; if (caption != null) { section.AddParagraph(caption); } graphPresenter.Detach(); graphView.MainWidget.Cleanup(); } else if (tag is Map && (tag as Map).GetCoordinates().Count > 0) { #if NETFRAMEWORK MapPresenter mapPresenter = new MapPresenter(); MapView mapView = new MapView(null); mapPresenter.Attach(tag, mapView, explorerPresenter); var map = mapView.Export(); string pngFileName = Path.ChangeExtension(Path.GetTempFileName(), ".png"); if (map.Width > section.PageSetup.PageWidth) { map = ImageUtilities.ResizeImage(map, section.PageSetup.PageWidth, double.MaxValue); } map.Save(pngFileName); if (!String.IsNullOrEmpty(pngFileName)) { section.AddResizeImage(pngFileName); } mapPresenter.Detach(); mapView.MainWidget.Destroy(); #else section.AddParagraph("MapView has not been implemented in gtk3. Use the framework/gtk2 build instead."); #endif } else if (tag is AutoDocumentation.Image) { AutoDocumentation.Image imageTag = tag as AutoDocumentation.Image; string pngFileName = Path.Combine(WorkingDirectory, $"{imageTag.name}.png"); imageTag.image.Save(pngFileName, System.Drawing.Imaging.ImageFormat.Png); section.AddResizeImage(pngFileName); figureNumber++; } else if (tag is AutoDocumentation.ModelView) { try { AutoDocumentation.ModelView modelView = tag as AutoDocumentation.ModelView; ViewNameAttribute viewName = ReflectionUtilities.GetAttribute(modelView.model.GetType(), typeof(ViewNameAttribute), false) as ViewNameAttribute; PresenterNameAttribute presenterName = ReflectionUtilities.GetAttribute(modelView.model.GetType(), typeof(PresenterNameAttribute), false) as PresenterNameAttribute; if (viewName != null && presenterName != null) { ViewBase owner = ViewBase.MasterView as ViewBase; if (viewName.ToString() == "UserInterface.Views.MapView") { owner = null; } ViewBase view = Assembly.GetExecutingAssembly().CreateInstance(viewName.ToString(), false, BindingFlags.Default, null, new object[] { owner }, null, null) as ViewBase; IPresenter presenter = Assembly.GetExecutingAssembly().CreateInstance(presenterName.ToString()) as IPresenter; if (view != null && presenter != null) { explorerPresenter.ApsimXFile.Links.Resolve(presenter); presenter.Attach(modelView.model, view, explorerPresenter); #if NETFRAMEWORK Gtk.Window popupWin = new Gtk.Window(Gtk.WindowType.Popup); #endif try { #if NETFRAMEWORK popupWin.SetSizeRequest(700, 700); popupWin.Add(view.MainWidget); #endif if (view is MapView map) { map.HideZoomControls(); } #if NETFRAMEWORK popupWin.ShowAll(); #endif while (Gtk.Application.EventsPending()) { Gtk.Application.RunIteration(); } // From MapView: // With WebKit, it appears we need to give it time to actually update the display // Really only a problem with the temporary windows used for generating documentation string pngFileName; if (view is MapView mapView) { var img = mapView.Export(); pngFileName = Path.ChangeExtension(Path.GetTempFileName(), ".png"); if (section.PageSetup.PageWidth > 0 && img.Width > section.PageSetup.PageWidth) { img = ImageUtilities.ResizeImage(img, section.PageSetup.PageWidth, double.MaxValue); } img.Save(pngFileName); } else { pngFileName = (presenter as IExportable).ExportToPNG(WorkingDirectory); } section.AddResizeImage(pngFileName); presenter.Detach(); view.MainWidget.Cleanup(); } finally { #if NETFRAMEWORK popupWin.Cleanup(); #endif while (GLib.MainContext.Iteration()) { ; } } } } } catch (Exception err) { Console.WriteLine(err); } } } }