1 //////////////////////////////////////////////////////////////////////////////
2 // Name: CSSValue.cpp
3 // Purpose:
4 // Author: Alex Thuering
5 // Created: 2005/05/03
6 // RCS-ID: $Id: CSSValue.cpp,v 1.13 2014/06/30 19:06:12 ntalex Exp $
7 // Copyright: (c) 2005 Alex Thuering
8 // Licence: wxWindows licence
9 //////////////////////////////////////////////////////////////////////////////
10
11 #include "CSSValue.h"
12 #include <wx/tokenzr.h>
13
14 static wxSortedArrayString* s_cssValues = NULL;
15 #include "css_values.cpp"
FillCSSValues()16 inline void FillCSSValues()
17 {
18 if (s_cssValues == NULL)
19 {
20 s_cssValues = new wxSortedArrayString;
21 for (unsigned int i=0; i<sizeof(s_cssValueStrings)/sizeof(s_cssValueStrings[0]); i++)
22 s_cssValues->Add(s_cssValueStrings[i]);
23 }
24 }
25
GetValueId(wxString value)26 wxCSS_VALUE wxCSSValue::GetValueId(wxString value)
27 {
28 FillCSSValues();
29 int id = s_cssValues->Index(value);
30 if (id >= 0)
31 return wxCSS_VALUE(id+1);
32 return wxCSS_VALUE_UNKNOWN;
33 }
34
GetValueString(wxCSS_VALUE id)35 wxString wxCSSValue::GetValueString(wxCSS_VALUE id)
36 {
37 FillCSSValues();
38 if (id == wxCSS_VALUE_UNKNOWN)
39 return wxT("");
40 return (*s_cssValues)[int(id)-1];
41 }
42
43 //////////////////////////////////////////////////////////////////////////////
44 ////////////////////////// wxCSSPrimitiveValue //////////////////////////////
45 //////////////////////////////////////////////////////////////////////////////
46
wxCSSPrimitiveValue(const wxCSSPrimitiveValue & src)47 wxCSSPrimitiveValue::wxCSSPrimitiveValue(const wxCSSPrimitiveValue& src):
48 wxCSSValue(wxCSS_PRIMITIVE_VALUE)
49 {
50 m_primitiveType = src.m_primitiveType;
51 if (m_primitiveType == wxCSS_UNKNOWN);
52 else if (int(m_primitiveType) >= int(wxCSS_NUMBER) &&
53 int(m_primitiveType) <= int(wxCSS_DIMENSION))
54 m_number = src.m_number;
55 else if (m_primitiveType == wxCSS_IDENT)
56 m_ident = src.m_ident;
57 else if (m_primitiveType == wxCSS_STRING ||
58 m_primitiveType == wxCSS_URI ||
59 m_primitiveType == wxCSS_ATTR)
60 m_string = new wxString(*src.m_string);
61 else if (m_primitiveType == wxCSS_RECT)
62 m_rect = new wxRect(*src.m_rect);
63 else if (m_primitiveType == wxCSS_RGBCOLOR)
64 m_color = new wxRGBColor(*src.m_color);
65 }
66
GetCSSText() const67 wxString wxCSSPrimitiveValue::GetCSSText() const
68 {
69 if (m_primitiveType == wxCSS_URI)
70 return wxT("url(") + *m_string + wxT(")");
71 return GetStringValue();
72 }
73
SetStringValue(wxCSS_PRIMITIVE_TYPE stringType,const wxString & stringValue)74 void wxCSSPrimitiveValue::SetStringValue(wxCSS_PRIMITIVE_TYPE stringType, const wxString& stringValue)
75 {
76 if (m_primitiveType != wxCSS_STRING &&
77 m_primitiveType != wxCSS_URI &&
78 m_primitiveType != wxCSS_ATTR)
79 {
80 CleanUp();
81 m_string = new wxString;
82 }
83 m_primitiveType = stringType == wxCSS_URI || stringType == wxCSS_ATTR ? stringType : wxCSS_STRING;
84 *m_string = stringValue;
85 }
86
GetStringValue() const87 wxString wxCSSPrimitiveValue::GetStringValue() const
88 {
89 switch (m_primitiveType)
90 {
91 case wxCSS_STRING:
92 case wxCSS_URI:
93 case wxCSS_ATTR:
94 return *m_string;
95 case wxCSS_IDENT:
96 return GetValueString(m_ident);
97 case wxCSS_COUNTER:
98 break;
99 case wxCSS_RECT:
100 break;
101 case wxCSS_RGBCOLOR:
102 if (m_color->Ok())
103 return wxString::Format(_T("#%02x%02x%02x"),
104 m_color->Red(), m_color->Green(), m_color->Blue());
105 break;
106 case wxCSS_UNKNOWN:
107 break;
108 default:
109 return wxString::Format(wxT("%g"), m_number);
110 }
111 return wxT("");
112 }
113
SetFloatValue(wxCSS_PRIMITIVE_TYPE unitType,double doubleValue)114 void wxCSSPrimitiveValue::SetFloatValue(wxCSS_PRIMITIVE_TYPE unitType, double doubleValue)
115 {
116 CleanUp();
117 m_primitiveType =
118 int(unitType) >= int(wxCSS_NUMBER) &&
119 int(unitType) <= int(wxCSS_DIMENSION) ? unitType : wxCSS_NUMBER;
120 m_number = doubleValue;
121 }
122
GetFloatValue(wxCSS_PRIMITIVE_TYPE unitType) const123 double wxCSSPrimitiveValue::GetFloatValue(wxCSS_PRIMITIVE_TYPE unitType) const
124 {
125 if (int(m_primitiveType) >= int(wxCSS_NUMBER) &&
126 int(m_primitiveType) <= int(wxCSS_DIMENSION))
127 return m_number;
128 return 0;
129 }
130
SetRectValue(const wxRect & rect)131 void wxCSSPrimitiveValue::SetRectValue(const wxRect& rect)
132 {
133 if (m_primitiveType != wxCSS_RECT)
134 {
135 CleanUp();
136 m_rect = new wxRect;
137 }
138 m_primitiveType = wxCSS_RECT;
139 *m_rect = rect;
140 }
141
GetRectValue() const142 wxRect wxCSSPrimitiveValue::GetRectValue() const
143 {
144 if (m_primitiveType == wxCSS_RECT)
145 return *m_rect;
146 return wxRect();
147 }
148
SetRGBColorValue(const wxRGBColor & color)149 void wxCSSPrimitiveValue::SetRGBColorValue(const wxRGBColor& color)
150 {
151 if (m_primitiveType != wxCSS_RGBCOLOR)
152 {
153 CleanUp();
154 m_color = new wxRGBColor;
155 }
156 m_primitiveType = wxCSS_RGBCOLOR;
157 *m_color = color;
158 }
159
GetRGBColorValue() const160 wxRGBColor wxCSSPrimitiveValue::GetRGBColorValue() const
161 {
162 if (m_primitiveType == wxCSS_RGBCOLOR)
163 return *m_color;
164 return wxRGBColor();
165 }
166
SetIdentValue(wxCSS_VALUE ident)167 void wxCSSPrimitiveValue::SetIdentValue(wxCSS_VALUE ident)
168 {
169 if (m_primitiveType != wxCSS_IDENT)
170 CleanUp();
171 m_primitiveType = wxCSS_IDENT;
172 m_ident = ident;
173 }
174
GetIdentValue() const175 wxCSS_VALUE wxCSSPrimitiveValue::GetIdentValue() const
176 {
177 if (m_primitiveType == wxCSS_IDENT)
178 return m_ident;
179 return wxCSS_VALUE_UNKNOWN;
180 }
181
CleanUp()182 void wxCSSPrimitiveValue::CleanUp()
183 {
184 if (m_primitiveType == wxCSS_STRING ||
185 m_primitiveType == wxCSS_URI ||
186 m_primitiveType == wxCSS_ATTR)
187 delete m_string;
188 else if (m_primitiveType == wxCSS_RECT)
189 delete m_rect;
190 else if (m_primitiveType == wxCSS_RGBCOLOR)
191 delete m_color;
192 m_primitiveType = wxCSS_UNKNOWN;
193 }
194
195 //////////////////////////////////////////////////////////////////////////////
196 ///////////////////////////// wxCSSValueList ////////////////////////////////
197 //////////////////////////////////////////////////////////////////////////////
198
wxCSSValueList(const wxCSSValueList & src)199 wxCSSValueList::wxCSSValueList(const wxCSSValueList& src)
200 : wxCSSValue()
201 {
202 m_values = src.m_values;
203 }
204
GetCSSText() const205 wxString wxCSSValueList::GetCSSText() const {
206 wxString result;
207 for (std::vector<double>::const_iterator it = m_values.begin(); it != m_values.end(); ++it) {
208 if (result.length())
209 result += wxT(", ");
210 result += wxString::Format(wxT("%g"), *it);
211 }
212 return result;
213 }
214
SetCSSText(const wxString & value)215 void wxCSSValueList::SetCSSText(const wxString& value) {
216 double val;
217 wxStringTokenizer tkz(value, wxT(", \t"));
218 while (tkz.HasMoreTokens()) {
219 wxString token = tkz.GetNextToken();
220 if (token.length() && token.ToDouble(&val))
221 m_values.push_back(val);
222 }
223 }
224