[12762] | 1 | using System;
|
---|
| 2 | using System.Xml;
|
---|
| 3 |
|
---|
| 4 | namespace SharpVectors.Dom.Css
|
---|
| 5 | {
|
---|
| 6 | public class CssAbsPrimitiveLengthValue : CssPrimitiveLengthValue
|
---|
| 7 | {
|
---|
| 8 | public CssAbsPrimitiveLengthValue(CssPrimitiveValue cssValue, string propertyName, XmlElement element)
|
---|
| 9 | {
|
---|
| 10 | if (cssValue.PrimitiveType == CssPrimitiveType.Ident)
|
---|
| 11 | {
|
---|
| 12 | // this is primarily to deal with font sizes.
|
---|
| 13 | float absSize;
|
---|
| 14 | switch (cssValue.GetStringValue())
|
---|
| 15 | {
|
---|
| 16 | case "xx-small":
|
---|
| 17 | absSize = 6F;
|
---|
| 18 | break;
|
---|
| 19 | case "x-small":
|
---|
| 20 | absSize = 7.5F;
|
---|
| 21 | break;
|
---|
| 22 | case "small":
|
---|
| 23 | absSize = 8.88F;
|
---|
| 24 | break;
|
---|
| 25 | case "large":
|
---|
| 26 | absSize = 12F;
|
---|
| 27 | break;
|
---|
| 28 | case "x-large":
|
---|
| 29 | absSize = 15F;
|
---|
| 30 | break;
|
---|
| 31 | case "xx-large":
|
---|
| 32 | absSize = 20F;
|
---|
| 33 | break;
|
---|
| 34 | case "larger":
|
---|
| 35 | case "smaller":
|
---|
| 36 | float parSize;
|
---|
| 37 | if(_parentElement != null)
|
---|
| 38 | {
|
---|
| 39 | CssStyleDeclaration csd = (CssStyleDeclaration)_ownerDocument.GetComputedStyle(_parentElement, String.Empty);
|
---|
| 40 | CssPrimitiveValue cssPrimValue = csd.GetPropertyCssValue("font-size") as CssPrimitiveValue;
|
---|
| 41 |
|
---|
| 42 | // no default font-size set => use 10px
|
---|
| 43 | if(cssPrimValue == null)
|
---|
| 44 | {
|
---|
| 45 | parSize = 10;
|
---|
| 46 | }
|
---|
| 47 | else
|
---|
| 48 | {
|
---|
| 49 | parSize = (float)cssPrimValue.GetFloatValue(CssPrimitiveType.Px);
|
---|
| 50 | }
|
---|
| 51 | }
|
---|
| 52 | else
|
---|
| 53 | {
|
---|
| 54 | parSize = 10;
|
---|
| 55 | }
|
---|
| 56 | if(cssValue.GetStringValue() == "smaller") absSize = parSize / 1.2F;
|
---|
| 57 | else absSize = parSize * 1.2F;
|
---|
| 58 | break;
|
---|
| 59 | default:
|
---|
| 60 | absSize = 10F;
|
---|
| 61 | break;
|
---|
| 62 | }
|
---|
| 63 | SetFloatValue(absSize);
|
---|
| 64 | SetPrimitiveType(CssPrimitiveType.Px);
|
---|
| 65 | }
|
---|
| 66 | else
|
---|
| 67 | {
|
---|
| 68 | SetFloatValue(cssValue.GetFloatValue(cssValue.PrimitiveType));
|
---|
| 69 | SetPrimitiveType(cssValue.PrimitiveType);
|
---|
| 70 | }
|
---|
| 71 | _propertyName = propertyName;
|
---|
| 72 | _element = element;
|
---|
| 73 | }
|
---|
| 74 |
|
---|
| 75 | public override bool ReadOnly
|
---|
| 76 | {
|
---|
| 77 | get
|
---|
| 78 | {
|
---|
| 79 | return false;
|
---|
| 80 | }
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | #region Private members
|
---|
| 84 | private string _propertyName;
|
---|
| 85 | private XmlElement _element;
|
---|
| 86 |
|
---|
| 87 | private XmlElement _parentElement
|
---|
| 88 | {
|
---|
| 89 | get
|
---|
| 90 | {
|
---|
| 91 | return _element.ParentNode as XmlElement;
|
---|
| 92 | }
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | private CssXmlDocument _ownerDocument
|
---|
| 96 | {
|
---|
| 97 | get
|
---|
| 98 | {
|
---|
| 99 | return _element.OwnerDocument as CssXmlDocument;
|
---|
| 100 | }
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | private double _getFontSize()
|
---|
| 104 | {
|
---|
| 105 | CssPrimitiveValue cssPrimValue;
|
---|
| 106 | XmlElement elmToUse;
|
---|
| 107 | if(_propertyName != null && _propertyName.Equals("font-size"))
|
---|
| 108 | {
|
---|
| 109 | elmToUse = _parentElement;
|
---|
| 110 | }
|
---|
| 111 | else
|
---|
| 112 | {
|
---|
| 113 | elmToUse = _element;
|
---|
| 114 | }
|
---|
| 115 |
|
---|
| 116 | if(elmToUse == null)
|
---|
| 117 | {
|
---|
| 118 | return 10;
|
---|
| 119 | }
|
---|
| 120 | else
|
---|
| 121 | {
|
---|
| 122 | CssStyleDeclaration csd = (CssStyleDeclaration)_ownerDocument.GetComputedStyle(elmToUse, String.Empty);
|
---|
| 123 | cssPrimValue = csd.GetPropertyCssValue("font-size") as CssPrimitiveValue;
|
---|
| 124 |
|
---|
| 125 | // no default font-size set => use 10px
|
---|
| 126 | if(cssPrimValue == null)
|
---|
| 127 | {
|
---|
| 128 | return 10;
|
---|
| 129 | }
|
---|
| 130 | else
|
---|
| 131 | {
|
---|
| 132 | return cssPrimValue.GetFloatValue(CssPrimitiveType.Px);
|
---|
| 133 | }
|
---|
| 134 | }
|
---|
| 135 |
|
---|
| 136 |
|
---|
| 137 | }
|
---|
| 138 |
|
---|
| 139 | private double _getPxLength()
|
---|
| 140 | {
|
---|
| 141 | //double floatValue = this. _cssValue.GetFloatValue(_cssValue.PrimitiveType);
|
---|
| 142 | switch(PrimitiveType)
|
---|
| 143 | {
|
---|
| 144 | case CssPrimitiveType.In:
|
---|
| 145 | return floatValue * Dpi;
|
---|
| 146 | case CssPrimitiveType.Cm:
|
---|
| 147 | return floatValue / CmPerIn * Dpi;
|
---|
| 148 | case CssPrimitiveType.Mm:
|
---|
| 149 | return floatValue / 10 / CmPerIn * Dpi;
|
---|
| 150 | case CssPrimitiveType.Pt:
|
---|
| 151 | return floatValue / 72 * Dpi;
|
---|
| 152 | case CssPrimitiveType.Pc:
|
---|
| 153 | return floatValue / 6 * Dpi;
|
---|
| 154 | case CssPrimitiveType.Ems:
|
---|
| 155 | return floatValue * _getFontSize();
|
---|
| 156 | case CssPrimitiveType.Exs:
|
---|
| 157 | return floatValue * _getFontSize() * 0.5F;
|
---|
| 158 | default:
|
---|
| 159 | return floatValue;
|
---|
| 160 | }
|
---|
| 161 | }
|
---|
| 162 |
|
---|
| 163 | private double _getInLength()
|
---|
| 164 | {
|
---|
| 165 | return _getPxLength() / Dpi;
|
---|
| 166 | }
|
---|
| 167 | #endregion
|
---|
| 168 |
|
---|
| 169 | #region Public members
|
---|
| 170 | public string PropertyName
|
---|
| 171 | {
|
---|
| 172 | get
|
---|
| 173 | {
|
---|
| 174 | return _propertyName;
|
---|
| 175 | }
|
---|
| 176 | }
|
---|
| 177 | #endregion
|
---|
| 178 |
|
---|
| 179 | #region Overrides of CssPrimitiveLengthValue
|
---|
| 180 | public override double GetFloatValue(CssPrimitiveType unitType)
|
---|
| 181 | {
|
---|
| 182 | double ret;
|
---|
| 183 | if(PrimitiveType == CssPrimitiveType.Percentage)
|
---|
| 184 | {
|
---|
| 185 | if(unitType == CssPrimitiveType.Percentage)
|
---|
| 186 | {
|
---|
| 187 | return floatValue;
|
---|
| 188 | }
|
---|
| 189 | else
|
---|
| 190 | {
|
---|
| 191 | throw new NotImplementedException("Can't get absolute values from percentages");
|
---|
| 192 | }
|
---|
| 193 | }
|
---|
| 194 | else
|
---|
| 195 | {
|
---|
| 196 | switch(unitType)
|
---|
| 197 | {
|
---|
| 198 | case CssPrimitiveType.Cm:
|
---|
| 199 | ret = _getInLength() * CmPerIn;
|
---|
| 200 | break;
|
---|
| 201 | case CssPrimitiveType.Mm:
|
---|
| 202 | ret = _getInLength() * CmPerIn * 10;
|
---|
| 203 | break;
|
---|
| 204 | case CssPrimitiveType.In:
|
---|
| 205 | ret = _getInLength();
|
---|
| 206 | break;
|
---|
| 207 | case CssPrimitiveType.Pc:
|
---|
| 208 | ret = _getInLength() * 6;
|
---|
| 209 | break;
|
---|
| 210 | case CssPrimitiveType.Pt:
|
---|
| 211 | ret = _getInLength() * 72;
|
---|
| 212 | break;
|
---|
| 213 | case CssPrimitiveType.Ems:
|
---|
| 214 | ret = _getPxLength() / _getFontSize();
|
---|
| 215 | break;
|
---|
| 216 | case CssPrimitiveType.Exs:
|
---|
| 217 | ret = _getPxLength() / (_getFontSize() * 0.5);
|
---|
| 218 | break;
|
---|
| 219 | default:
|
---|
| 220 | ret = _getPxLength();
|
---|
| 221 | break;
|
---|
| 222 | }
|
---|
| 223 | }
|
---|
| 224 | return ret;
|
---|
| 225 | }
|
---|
| 226 | #endregion
|
---|
| 227 | }
|
---|
| 228 | }
|
---|