Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GrammaticalOptimization/SharpVectorModel/BasicTypes/SvgUriReference.cs @ 13918

Last change on this file since 13918 was 12762, checked in by aballeit, 9 years ago

#2283 GUI updates, Tree-chart, MCTS Version 2 (prune leaves)

File size: 6.3 KB
Line 
1using System;
2using System.Xml;
3using System.IO;
4using System.Net;
5using SharpVectors.Net;
6using SharpVectors.Dom.Css;
7
8namespace SharpVectors.Dom.Svg
9{
10    public sealed class SvgUriReference : ISvgUriReference
11    {
12        #region Private Fields
13
14        private string absoluteUri;
15        private SvgElement ownerElement;
16        private ISvgAnimatedString href;
17
18        #endregion
19
20        #region Constructors and Destructor
21
22        public SvgUriReference(SvgElement ownerElement)
23        {
24            this.ownerElement = ownerElement;
25            this.ownerElement.attributeChangeHandler += new NodeChangeHandler(AttributeChange);
26        }
27
28        #endregion
29
30        #region Public Events
31
32        public event NodeChangeHandler NodeChanged;
33
34        #endregion
35
36        #region Public Properties
37
38        public string AbsoluteUri
39        {
40            get
41            {
42                if (absoluteUri == null)
43                {
44                    if (ownerElement.HasAttribute("href", SvgDocument.XLinkNamespace))
45                    {
46                        string href = Href.AnimVal.Trim();
47
48                        if (href.StartsWith("#"))
49                        {
50                            return href;
51                        }
52                        else
53                        {
54                            string baseUri = ownerElement.BaseURI;
55                            if (baseUri.Length == 0)
56                            {
57                                Uri sourceUri = new Uri(Href.AnimVal, UriKind.RelativeOrAbsolute);
58                                if (sourceUri.IsAbsoluteUri)
59                                {
60                                    absoluteUri = sourceUri.ToString();
61                                }
62                            }
63                            else
64                            {
65                                Uri sourceUri = null;
66                                string xmlBaseUrl = this.GetBaseUrl();
67                                if (!String.IsNullOrEmpty(xmlBaseUrl))
68                                {
69                                    sourceUri = new Uri(new Uri(ownerElement.BaseURI),
70                                        Path.Combine(xmlBaseUrl, Href.AnimVal));
71                                }
72                                else
73                                {
74                                    sourceUri = new Uri(new Uri(ownerElement.BaseURI), Href.AnimVal);
75                                }
76
77                                absoluteUri = sourceUri.ToString();
78                            }
79                        }
80                    }
81                }
82                return absoluteUri;
83            }
84        }
85
86        public XmlNode ReferencedNode
87        {
88            get
89            {
90                if (ownerElement.HasAttribute("href", SvgDocument.XLinkNamespace))
91                {
92                    XmlNode referencedNode = ownerElement.OwnerDocument.GetNodeByUri(AbsoluteUri);
93
94                    ISvgExternalResourcesRequired extReqElm =
95                        ownerElement as ISvgExternalResourcesRequired;
96
97                    if (referencedNode == null && extReqElm != null)
98                    {
99                        if (extReqElm.ExternalResourcesRequired.AnimVal)
100                        {
101                            throw new SvgExternalResourcesRequiredException();
102                        }
103                    }
104
105                    return referencedNode;
106                }
107
108                return null;
109            }
110        }
111
112        public WebResponse ReferencedResource
113        {
114            get
115            {
116                if (ownerElement.HasAttribute("href", SvgDocument.XLinkNamespace))
117                {
118                    string absoluteUri = this.AbsoluteUri;
119                    if (!String.IsNullOrEmpty(absoluteUri))
120                    {
121                        WebResponse referencedResource = ownerElement.OwnerDocument.GetResource(
122                            new Uri(absoluteUri));
123
124                        ISvgExternalResourcesRequired extReqElm =
125                            ownerElement as ISvgExternalResourcesRequired;
126
127                        if (referencedResource == null && extReqElm != null)
128                        {
129                            if (extReqElm.ExternalResourcesRequired.AnimVal)
130                            {
131                                throw new SvgExternalResourcesRequiredException();
132                            }
133                        }
134
135                        return referencedResource;
136                    }
137                }
138
139                return null;
140            }
141        }
142
143        #endregion
144
145        #region Update handling
146
147        private void AttributeChange(Object src, XmlNodeChangedEventArgs args)
148        {
149            XmlAttribute attribute = src as XmlAttribute;
150
151            if (attribute.NamespaceURI == SvgDocument.XLinkNamespace &&
152                attribute.LocalName == "href")
153            {
154                href = null;
155                absoluteUri = null;
156            }
157        }
158
159        private void ReferencedNodeChange(Object src, XmlNodeChangedEventArgs args)
160        {
161            if (NodeChanged != null)
162            {
163                NodeChanged(src, args);
164            }
165        }
166
167        #endregion
168
169        #region ISvgURIReference Members
170
171        public ISvgAnimatedString Href
172        {
173            get
174            {
175                if (href == null)
176                {
177                    href = new SvgAnimatedString(ownerElement.GetAttribute("href",
178                        SvgDocument.XLinkNamespace));
179                }
180                return href;
181            }
182        }
183
184        #endregion
185
186        #region Private Methods
187
188        private string GetBaseUrl()
189        {
190            if (ownerElement.HasAttribute("xml:base"))
191            {
192                return ownerElement.GetAttribute("xml:base");
193            }
194            XmlElement parentNode = ownerElement.ParentNode as XmlElement;
195            if (parentNode != null && parentNode.HasAttribute("xml:base"))
196            {
197                return parentNode.GetAttribute("xml:base");
198            }
199
200            return null;
201        }
202
203        #endregion
204    }
205}
Note: See TracBrowser for help on using the repository browser.