X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fbuilder%2Ftree-node-manipulator.cpp;h=95673067b5d3b77375569e1bede887e6f0bffd3d;hp=3e10eddb89abe7531ad0afd232f10c4e2c53873f;hb=e121ef45809e2585ac40bbf33e472c107a6b2879;hpb=c3f7ea6cb0c0b75c2276193aff88b5c7a679a2d5 diff --git a/dali-toolkit/internal/builder/tree-node-manipulator.cpp b/dali-toolkit/internal/builder/tree-node-manipulator.cpp index 3e10edd..9567306 100644 --- a/dali-toolkit/internal/builder/tree-node-manipulator.cpp +++ b/dali-toolkit/internal/builder/tree-node-manipulator.cpp @@ -36,16 +36,37 @@ namespace Internal namespace { -void Indent(std::ostream& o, int indent) +void Indent(std::ostream& o, int level, int indentWidth) { - for (int i = 0; i < indent; ++i) + for (int i = 0; i < level*indentWidth; ++i) { o << " "; } } +std::string EscapeQuotes( const char* aString) +{ + std::string escapedString; + int length = strlen(aString); + escapedString.reserve(length); + + const char* end = aString+length; + for( const char* iter = aString; iter != end ; ++iter) + { + if(*iter != '\"') + { + escapedString.push_back(*iter); + } + else + { + escapedString.append("\\\""); + } + } + return escapedString; } +} // anonymous namespace + TreeNodeManipulator::TreeNodeManipulator(TreeNode* node) : mNode(node) { @@ -270,6 +291,19 @@ void TreeNodeManipulator::SetType( TreeNode::NodeType type) } } } + else if( TreeNode::ARRAY == mNode->mType ) + { + if( mNode->mFirstChild != NULL ) + { + TreeNode::NodeType type = mNode->mFirstChild->GetType(); + + if( TreeNode::FLOAT == type || TreeNode::INTEGER == type ) + { + // Arrays of numbers should be replaced, not appended to. + RemoveChildren(); + } + } + } } void TreeNodeManipulator::SetName( const char* name ) @@ -327,14 +361,17 @@ void TreeNodeManipulator::SetBoolean( bool b ) void TreeNodeManipulator::Write(std::ostream& output, int indent) const { DALI_ASSERT_DEBUG(mNode && "Operation on NULL JSON node"); - DoWrite(mNode, output, indent); + DoWrite(mNode, output, 0, indent, false); } -void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, int indent) const +void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, int level, int indentWidth, bool groupChildren) const { DALI_ASSERT_DEBUG(value && "Operation on NULL JSON node"); - Indent(output, indent); + if(!groupChildren) + { + Indent(output, level, indentWidth); + } if (value->GetName()) { @@ -348,9 +385,9 @@ void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, i output << "null"; if(NULL != value->mNextSibling) { - output << ","; + output << ", "; } - if(indent) + if( !groupChildren ) { output << std::endl; } @@ -359,58 +396,89 @@ void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, i case TreeNode::OBJECT: case TreeNode::ARRAY: { + bool groupMyChildren = false; + + if( TreeNode::ARRAY == value->GetType() && value->mFirstChild && + ( TreeNode::INTEGER == value->mFirstChild->GetType() || + TreeNode::FLOAT == value->mFirstChild->GetType() ) ) + { + groupMyChildren = true; + } + if( value->GetType() == TreeNode::OBJECT) { + output << std::endl; + Indent(output, level, indentWidth); output << "{"; - if(indent) - { - output << std::endl; - } } else { - output << "["; - if(indent) + if( !groupMyChildren ) { output << std::endl; + Indent(output, level, indentWidth); } + output << "["; + } + + if( groupMyChildren ) + { + output << " "; + } + else + { + output << std::endl; } for (TreeNode::ConstIterator it = value->CBegin(); it != value->CEnd(); ++it) { - DoWrite( &((*it).second), output, indent + 1); + DoWrite( &((*it).second), output, level+1, indentWidth, groupMyChildren ); } - Indent(output, indent); + + if( !groupMyChildren ) + { + Indent(output, level, indentWidth); + } + if( value->GetType() == TreeNode::OBJECT ) { output << "}"; - if(indent) - { - output << std::endl; - } } else { output << "]"; - if(indent) - { - output << std::endl; - } } + + if( NULL != value->mNextSibling ) + { + output << ","; + } + + if( !groupChildren ) + { + output << std::endl; + } + + groupChildren = false; break; } case TreeNode::STRING: { - output << "\"" << value->GetString() << "\""; + std::string escapedString = EscapeQuotes(value->GetString()); + output << "\"" << escapedString << "\""; if(NULL != value->mNextSibling) { output << ","; } - if(indent) + + if( groupChildren ) + { + output << " "; + } + else { output << std::endl; } - break; } case TreeNode::INTEGER: @@ -420,11 +488,15 @@ void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, i { output << ","; } - if(indent) + + if( groupChildren ) + { + output << " "; + } + else { output << std::endl; } - break; } case TreeNode::FLOAT: @@ -436,7 +508,12 @@ void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, i { output << ","; } - if(indent) + + if( groupChildren ) + { + output << " "; + } + else { output << std::endl; } @@ -452,11 +529,17 @@ void TreeNodeManipulator::DoWrite(const TreeNode *value, std::ostream& output, i { output << "false"; } + if(NULL != value->mNextSibling) { output << ","; } - if(indent) + + if( groupChildren ) + { + output << " "; + } + else { output << std::endl; } @@ -520,4 +603,3 @@ char *CopyString( const char *fromString, VectorCharIter& iter, const VectorChar } // namespace Toolkit } // namespace Dali -