+} // namespace
+
+Builder::Builder()
+: mSlotDelegate(this)
+{
+ mParser = Dali::Toolkit::JsonParser::New();
+
+ Property::Map defaultConstants;
+ defaultConstants[TOKEN_STRING(DALI_IMAGE_DIR)] = AssetManager::GetDaliImagePath();
+ defaultConstants[TOKEN_STRING(DALI_SOUND_DIR)] = AssetManager::GetDaliSoundPath();
+ defaultConstants[TOKEN_STRING(DALI_STYLE_DIR)] = AssetManager::GetDaliStylePath();
+ defaultConstants[TOKEN_STRING(DALI_STYLE_IMAGE_DIR)] = AssetManager::GetDaliStyleImagePath();
+ defaultConstants[TOKEN_STRING(DALI_SHADER_VERSION_PREFIX)] = Shader::GetShaderVersionPrefix();
+ defaultConstants[TOKEN_STRING(DALI_VERTEX_SHADER_PREFIX)] = Shader::GetVertexShaderPrefix();
+ defaultConstants[TOKEN_STRING(DALI_FRAGMENT_SHADER_PREFIX)] = Shader::GetFragmentShaderPrefix();
+
+ AddConstants(defaultConstants);
+}
+
+void Builder::LoadFromString(std::string const& data, Dali::Toolkit::Builder::UIFormat format)
+{
+ // parser to get constants and includes only
+ Dali::Toolkit::JsonParser parser = Dali::Toolkit::JsonParser::New();
+
+ if(!parser.Parse(data))
+ {
+ DALI_LOG_WARNING("JSON Parse Error:%d:%d:'%s'\n",
+ parser.GetErrorLineNumber(),
+ parser.GetErrorColumn(),
+ parser.GetErrorDescription().c_str());
+
+ DALI_ASSERT_ALWAYS(!"Cannot parse JSON");
+ }
+ else
+ {
+ // load constant map (allows the user to override the constants in the json after loading)
+ LoadConstants(*parser.GetRoot(), mReplacementMap);
+ // load configuration map
+ LoadConfiguration(*parser.GetRoot(), mConfigurationMap);
+ // merge includes
+ if(OptionalChild includes = IsChild(*parser.GetRoot(), KEYNAME_INCLUDES))
+ {
+ Replacement replacer(mReplacementMap);
+
+ for(TreeNode::ConstIterator iter = (*includes).CBegin(); iter != (*includes).CEnd(); ++iter)
+ {
+ OptionalString filename = replacer.IsString((*iter).second);
+
+ if(filename)
+ {
+#if defined(DEBUG_ENABLED)
+ DALI_SCRIPT_VERBOSE("Loading Include '%s'\n", (*filename).c_str());
+#endif
+ LoadFromString(GetFileContents(*filename));
+ }
+ }
+ }
+
+ if(mParser.Parse(data))
+ {
+ // Drop the styles and get them to be rebuilt against the new parse tree as required.
+ mStyles.Clear();
+ }
+ else
+ {
+ DALI_LOG_WARNING("JSON Parse Error:%d:%d:'%s'\n",
+ mParser.GetErrorLineNumber(),
+ mParser.GetErrorColumn(),
+ mParser.GetErrorDescription().c_str());
+
+ DALI_ASSERT_ALWAYS(!"Cannot parse JSON");
+ }
+ }
+
+ DUMP_PARSE_TREE(mParser); // This macro only writes out if DEBUG is enabled and the "DUMP_TREE" constant is defined in the stylesheet.
+ DUMP_TEST_MAPPINGS(mParser);
+
+ DALI_ASSERT_ALWAYS(mParser.GetRoot() && "Cannot parse JSON");
+}
+
+void Builder::AddConstants(const Property::Map& map)
+{
+ mReplacementMap.Merge(map);
+}
+
+void Builder::AddConstant(const std::string& key, const Property::Value& value)