Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GrammaticalOptimization/SharpVectorCss/Css/CssAbsPrimitiveLengthValue.cs @ 12762

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

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

File size: 5.0 KB
Line 
1using System;
2using System.Xml;
3
4namespace 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}
Note: See TracBrowser for help on using the repository browser.