2005-10-04 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.Drawing / Mainsoft.Drawing.Configuration.jvm / ResolutionConfigurationHandler.cs
1 using System;\r
2 using System.Collections;\r
3 using System.Configuration;\r
4 using System.Xml;\r
5 \r
6 \r
7 namespace Mainsoft.Drawing.Configuration\r
8 {\r
9         /// <summary>\r
10         /// Summary description for MetadataConfigurationHandler.\r
11         /// </summary>\r
12         public class ResolutionConfigurationHandler : IConfigurationSectionHandler\r
13         {\r
14                 public ResolutionConfigurationHandler()\r
15                 {\r
16                         //\r
17                         // TODO: Add constructor logic here\r
18                         //\r
19                 }\r
20 \r
21                 public virtual object Create (object parent, object configContext, XmlNode section) {\r
22 \r
23                         if (section.Attributes != null && section.Attributes.Count != 0)\r
24                                 HandlersUtil.ThrowException ("Unrecognized attribute", section);\r
25 \r
26                         ResolutionConfigurationCollection col = \r
27                                 new ResolutionConfigurationCollection(parent as ResolutionConfigurationCollection);\r
28 \r
29                         XmlNodeList imageFormats = section.ChildNodes;\r
30                         foreach (XmlNode child in imageFormats) {\r
31                                 \r
32                                 XmlNodeType ntype = child.NodeType;\r
33                                 if (ntype == XmlNodeType.Whitespace || ntype == XmlNodeType.Comment)\r
34                                         continue;\r
35 \r
36                                 if (ntype != XmlNodeType.Element)\r
37                                         HandlersUtil.ThrowException ("Only elements allowed", child);\r
38 \r
39                                 string imageFormatName = HandlersUtil.ExtractAttributeValue ("name", child, false, false);\r
40 \r
41                                 string xResPath = HandlersUtil.ExtractNodeValue(child["xresolution"]);\r
42                                 string yResPath = HandlersUtil.ExtractNodeValue(child["yresolution"]);\r
43                                 string unitsType = HandlersUtil.ExtractNodeValue(child["unitstype"], false, true);\r
44 \r
45                                 string xResDefault = HandlersUtil.ExtractAttributeValue ("default", child["xresolution"]);\r
46                                 string yResDefault = HandlersUtil.ExtractAttributeValue ("default", child["yresolution"]);\r
47                                 string unitsTypeDefault = HandlersUtil.ExtractAttributeValue ("default", child["unitstype"], true);\r
48 \r
49                                 Hashtable unitScale = new Hashtable(3);\r
50 \r
51                                 XmlNodeList unitScaleNodes = child.SelectNodes("unitscale");\r
52                                 foreach (XmlNode unitScaleNode in unitScaleNodes) {\r
53                                         unitScale.Add(\r
54                                                 HandlersUtil.ExtractAttributeValue ("value", unitScaleNode),\r
55                                                 HandlersUtil.ExtractNodeValue(unitScaleNode) );\r
56                                 }\r
57 \r
58                                 ResolutionConfiguration resConf = new ResolutionConfiguration(\r
59                                         imageFormatName,\r
60                                         xResPath, yResPath, unitsType,\r
61                                         xResDefault, yResDefault, unitsTypeDefault,\r
62                                         unitScale);\r
63                                 \r
64                                 col.Add(resConf);\r
65                         }\r
66 \r
67                         col.Sort();\r
68                         return col;\r
69                 }\r
70         }\r
71 \r
72         internal sealed class HandlersUtil {\r
73                 private HandlersUtil () {\r
74                 }\r
75 \r
76                 static internal string ExtractNodeValue(XmlNode node, bool optional, bool allowEmpty) {\r
77                         if (node == null) {\r
78                                 if (optional)\r
79                                         return null;\r
80                                 ThrowException ("Required node not found", node);\r
81                         }\r
82 \r
83                         string nodeValue = node.InnerText;\r
84 \r
85                         if (!allowEmpty && nodeValue == String.Empty) {\r
86                                 string opt = optional ? "Optional" : "Required";\r
87                                 ThrowException (opt + " node is empty", node);\r
88                         }\r
89 \r
90                         return nodeValue;\r
91                 }\r
92 \r
93                 static internal string ExtractNodeValue(XmlNode node, bool optional) {\r
94                         return ExtractNodeValue(node, false, false);\r
95                 }\r
96 \r
97                 static internal string ExtractNodeValue(XmlNode node) {\r
98                         return ExtractNodeValue(node, false);\r
99                 }\r
100 \r
101                 static internal string ExtractAttributeValue (string attKey, XmlNode node) {\r
102                         return ExtractAttributeValue (attKey, node, false);\r
103                 }\r
104                         \r
105                 static internal string ExtractAttributeValue (string attKey, XmlNode node, bool optional) {\r
106                         return ExtractAttributeValue (attKey, node, optional, false);\r
107                 }\r
108                 \r
109                 static internal string ExtractAttributeValue (string attKey, XmlNode node, bool optional,\r
110                         bool allowEmpty) {\r
111                         if (node.Attributes == null) {\r
112                                 if (optional)\r
113                                         return null;\r
114 \r
115                                 ThrowException ("Required attribute not found: " + attKey, node);\r
116                         }\r
117 \r
118                         XmlNode att = node.Attributes.RemoveNamedItem (attKey);\r
119                         if (att == null) {\r
120                                 if (optional)\r
121                                         return null;\r
122                                 ThrowException ("Required attribute not found: " + attKey, node);\r
123                         }\r
124 \r
125                         string value = att.Value;\r
126                         if (!allowEmpty && value == String.Empty) {\r
127                                 string opt = optional ? "Optional" : "Required";\r
128                                 ThrowException (opt + " attribute is empty: " + attKey, node);\r
129                         }\r
130 \r
131                         return value;\r
132                 }\r
133 \r
134                 static internal void ThrowException (string msg, XmlNode node) {\r
135                         if (node != null && node.Name != String.Empty)\r
136                                 msg = msg + " (node name: " + node.Name + ") ";\r
137                         throw new ConfigurationException (msg, node);\r
138                 }\r
139         }\r
140 }\r