// Copyright (c) 2016-2017 Nicolas Musset. All rights reserved. // This file is licensed under the MIT license. // See the LICENSE.md file in the project root for more information. using System; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Http; using Markdig.Syntax.Inlines; using MatterHackers.Agg; using MatterHackers.Agg.Image; using MatterHackers.Agg.Platform; using MatterHackers.Agg.UI; using MatterHackers.MatterControl; namespace Markdig.Renderers.Agg.Inlines { public class TextLinkX : FlowLayoutWidget { public TextLinkX() { HAnchor = HAnchor.Fit; VAnchor = VAnchor.Fit; } public override void AddChild(GuiWidget childToAdd, int indexInChildrenList = -1) { base.AddChild(childToAdd, indexInChildrenList); } } public class ImageLinkSimpleX : FlowLayoutWidget { private static ImageBuffer icon = AggContext.StaticData.LoadIcon("internet.png", 16, 16); public ImageLinkSimpleX(string url) { HAnchor = HAnchor.Fit; VAnchor = VAnchor.Fit; var imageBuffer = new ImageBuffer(icon); var imageWidget = new ImageWidget(imageBuffer); this.Url = url; this.AddChild(imageWidget); if (url.StartsWith("http")) { ApplicationController.Instance.DownloadToImageAsync(imageBuffer, url, false); } } public string Url { get; } } public class ImageLinkAdvancedX : FlowLayoutWidget { private static HttpClient client = new HttpClient(); private static ImageBuffer icon = AggContext.StaticData.LoadIcon("internet.png", 16, 16); public string Url { get; } public ImageLinkAdvancedX(string url) { HAnchor = HAnchor.Fit; VAnchor = VAnchor.Fit; this.Url = url; var imageBuffer = new ImageBuffer(icon); var imageWidget = new ImageWidget(imageBuffer); this.AddChild(imageWidget); try { if (url.StartsWith("http")) { client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead).ContinueWith(task => { var response = task.Result; if (response.IsSuccessStatusCode) { Console.WriteLine(task.Result.Headers); response.Content.ReadAsStreamAsync().ContinueWith(streamTask => { //response.Headers.TryGetValues("", s[""] == "" || if (string.Equals(Path.GetExtension(url), ".svg", StringComparison.OrdinalIgnoreCase)) { // Load svg into SvgWidget, swap for ImageWidget try { var svgWidget = new SvgWidget(streamTask.Result, 1) { Border = 1, BorderColor = Color.YellowGreen }; this.ReplaceChild(imageWidget, svgWidget); } catch (Exception svgEx) { Debug.WriteLine("Error loading svg: {0} :: {1}", url, svgEx.Message); } } else { // Load img if (!AggContext.ImageIO.LoadImageData(streamTask.Result, imageBuffer)) { Debug.WriteLine("Error loading image: " + url); } } }); } }); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } /// /// A WPF renderer for a . /// /// public class AggLinkInlineRenderer : AggObjectRenderer { /// protected override void Write(AggRenderer renderer, LinkInline link) { var url = link.GetDynamicUrl != null ? link.GetDynamicUrl() ?? link.Url : link.Url; if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute)) { url = "#"; } if (!url.StartsWith("http")) { url = new Uri(renderer.BaseUri, url).AbsoluteUri; } if (link.IsImage) //link.IsImage) { renderer.WriteInline(new ImageLinkSimpleX(url)); // new ImageLinkAdvancedX(url)); //new InlineUIContainer(image)); } else { renderer.Push(new TextLinkX()); // hyperlink); renderer.WriteChildren(link); renderer.Pop(); } } } }