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