ax_node_data.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/accessibility/ax_node_data.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <set> 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/containers/hash_tables.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_util.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using base::DoubleToString; 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using base::IntToString; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace ui { 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string IntVectorToString(const std::vector<int>& items) { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string str; 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < items.size(); ++i) { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (i > 0) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) str += ","; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) str += IntToString(items[i]); 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return str; 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // Anonymous namespace 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AXNodeData::AXNodeData() 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : id(-1), 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) role(AX_ROLE_UNKNOWN), 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) state(-1) { 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)AXNodeData::~AXNodeData() { 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AXNodeData::AddStringAttribute( 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AXStringAttribute attribute, const std::string& value) { 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) string_attributes.push_back(std::make_pair(attribute, value)); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AXNodeData::AddIntAttribute( 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AXIntAttribute attribute, int value) { 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int_attributes.push_back(std::make_pair(attribute, value)); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AXNodeData::AddFloatAttribute( 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AXFloatAttribute attribute, float value) { 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) float_attributes.push_back(std::make_pair(attribute, value)); 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AXNodeData::AddBoolAttribute( 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AXBoolAttribute attribute, bool value) { 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool_attributes.push_back(std::make_pair(attribute, value)); 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AXNodeData::AddIntListAttribute( 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AXIntListAttribute attribute, const std::vector<int32>& value) { 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) intlist_attributes.push_back(std::make_pair(attribute, value)); 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AXNodeData::SetName(std::string name) { 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string_attributes.push_back(std::make_pair(AX_ATTR_NAME, name)); 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void AXNodeData::SetValue(std::string value) { 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string_attributes.push_back(std::make_pair(AX_ATTR_VALUE, value)); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string AXNodeData::ToString() const { 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string result; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += "id=" + IntToString(id); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " " + ui::ToString(role); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_BUSY)) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " BUSY"; 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_CHECKED)) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " CHECKED"; 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_COLLAPSED)) 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " COLLAPSED"; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_EXPANDED)) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " EXPANDED"; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_FOCUSABLE)) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " FOCUSABLE"; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_FOCUSED)) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " FOCUSED"; 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_HASPOPUP)) 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " HASPOPUP"; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_HOVERED)) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " HOVERED"; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_INDETERMINATE)) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " INDETERMINATE"; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_INVISIBLE)) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " INVISIBLE"; 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_LINKED)) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " LINKED"; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_MULTISELECTABLE)) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " MULTISELECTABLE"; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_OFFSCREEN)) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " OFFSCREEN"; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_PRESSED)) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " PRESSED"; 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_PROTECTED)) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " PROTECTED"; 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_READ_ONLY)) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " READONLY"; 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_REQUIRED)) 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " REQUIRED"; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_SELECTABLE)) 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " SELECTABLE"; 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_SELECTED)) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " SELECTED"; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_VERTICAL)) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " VERTICAL"; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (state & (1 << ui::AX_STATE_VISITED)) 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " VISITED"; 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " (" + IntToString(location.x()) + ", " + 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IntToString(location.y()) + ")-(" + 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IntToString(location.width()) + ", " + 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IntToString(location.height()) + ")"; 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < int_attributes.size(); ++i) { 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string value = IntToString(int_attributes[i].second); 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (int_attributes[i].first) { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_SCROLL_X: 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " scroll_x=" + value; 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_SCROLL_X_MIN: 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " scroll_x_min=" + value; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_SCROLL_X_MAX: 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " scroll_x_max=" + value; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_SCROLL_Y: 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " scroll_y=" + value; 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_SCROLL_Y_MIN: 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " scroll_y_min=" + value; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_SCROLL_Y_MAX: 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " scroll_y_max=" + value; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_HIERARCHICAL_LEVEL: 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " level=" + value; 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TEXT_SEL_START: 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " sel_start=" + value; 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TEXT_SEL_END: 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " sel_end=" + value; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_ROW_COUNT: 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " rows=" + value; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_COLUMN_COUNT: 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " cols=" + value; 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_CELL_COLUMN_INDEX: 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " col=" + value; 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_CELL_ROW_INDEX: 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " row=" + value; 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_CELL_COLUMN_SPAN: 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " colspan=" + value; 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_CELL_ROW_SPAN: 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " rowspan=" + value; 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_COLUMN_HEADER_ID: 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " column_header_id=" + value; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_COLUMN_INDEX: 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " column_index=" + value; 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_HEADER_ID: 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " header_id=" + value; 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_ROW_HEADER_ID: 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " row_header_id=" + value; 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TABLE_ROW_INDEX: 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " row_index=" + value; 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TITLE_UI_ELEMENT: 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " title_elem=" + value; 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_COLOR_VALUE_RED: 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " color_value_red=" + value; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_COLOR_VALUE_GREEN: 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " color_value_green=" + value; 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_COLOR_VALUE_BLUE: 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " color_value_blue=" + value; 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_TEXT_DIRECTION: 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (int_attributes[i].second) { 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_TEXT_DIRECTION_LR: 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " text_direction=lr"; 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_TEXT_DIRECTION_RL: 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " text_direction=rl"; 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_TEXT_DIRECTION_TB: 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " text_direction=tb"; 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_TEXT_DIRECTION_BT: 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " text_direction=bt"; 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_INT_ATTRIBUTE_NONE: 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < string_attributes.size(); ++i) { 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string value = string_attributes[i].second; 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (string_attributes[i].first) { 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DOC_URL: 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " doc_url=" + value; 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DOC_TITLE: 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " doc_title=" + value; 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DOC_MIMETYPE: 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " doc_mimetype=" + value; 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DOC_DOCTYPE: 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " doc_doctype=" + value; 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_ACCESS_KEY: 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " access_key=" + value; 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_ACTION: 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " action=" + value; 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DESCRIPTION: 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " description=" + value; 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DISPLAY: 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " display=" + value; 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_HELP: 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " help=" + value; 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_HTML_TAG: 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " html_tag=" + value; 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_LIVE_RELEVANT: 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " relevant=" + value; 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_LIVE_STATUS: 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " live=" + value; 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CONTAINER_LIVE_RELEVANT: 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " container_relevant=" + value; 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CONTAINER_LIVE_STATUS: 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " container_live=" + value; 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_ROLE: 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " role=" + value; 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_SHORTCUT: 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " shortcut=" + value; 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_URL: 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " url=" + value; 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_NAME: 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " name=" + value; 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_VALUE: 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " value=" + value; 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_STRING_ATTRIBUTE_NONE: 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < float_attributes.size(); ++i) { 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string value = DoubleToString(float_attributes[i].second); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (float_attributes[i].first) { 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DOC_LOADING_PROGRESS: 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " doc_progress=" + value; 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_VALUE_FOR_RANGE: 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " value_for_range=" + value; 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_MAX_VALUE_FOR_RANGE: 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " max_value=" + value; 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_MIN_VALUE_FOR_RANGE: 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " min_value=" + value; 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_FLOAT_ATTRIBUTE_NONE: 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < bool_attributes.size(); ++i) { 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string value = bool_attributes[i].second ? "true" : "false"; 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (bool_attributes[i].first) { 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_DOC_LOADED: 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " doc_loaded=" + value; 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_BUTTON_MIXED: 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " mixed=" + value; 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_LIVE_ATOMIC: 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " atomic=" + value; 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_LIVE_BUSY: 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " busy=" + value; 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CONTAINER_LIVE_ATOMIC: 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " container_atomic=" + value; 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CONTAINER_LIVE_BUSY: 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " container_busy=" + value; 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_ARIA_READONLY: 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " aria_readonly=" + value; 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CAN_SET_VALUE: 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " can_set_value=" + value; 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_UPDATE_LOCATION_ONLY: 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " update_location_only=" + value; 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CANVAS_HAS_FALLBACK: 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " has_fallback=" + value; 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_BOOL_ATTRIBUTE_NONE: 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < intlist_attributes.size(); ++i) { 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<int32>& values = intlist_attributes[i].second; 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (intlist_attributes[i].first) { 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_INDIRECT_CHILD_IDS: 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " indirect_child_ids=" + IntVectorToString(values); 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_LINE_BREAKS: 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " line_breaks=" + IntVectorToString(values); 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CELL_IDS: 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " cell_ids=" + IntVectorToString(values); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_UNIQUE_CELL_IDS: 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " unique_cell_ids=" + IntVectorToString(values); 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_CHARACTER_OFFSETS: 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " character_offsets=" + IntVectorToString(values); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_WORD_STARTS: 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " word_starts=" + IntVectorToString(values); 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_ATTR_WORD_ENDS: 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " word_ends=" + IntVectorToString(values); 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case AX_INT_LIST_ATTRIBUTE_NONE: 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!child_ids.empty()) 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result += " child_ids=" + IntVectorToString(child_ids); 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return result; 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace ui 385