#include #include "empty_visible_layout.h" extern "C" { #include #include } namespace Poincare { DynamicLayoutHierarchy::DynamicLayoutHierarchy() : ExpressionLayout(), m_children(nullptr), m_numberOfChildren(0) { } DynamicLayoutHierarchy::DynamicLayoutHierarchy(const ExpressionLayout * const * children, int numberOfChildren, bool cloneChildren) : ExpressionLayout(), m_numberOfChildren(numberOfChildren) { assert(children != nullptr); m_children = new const ExpressionLayout * [numberOfChildren]; for (int i=0; iclone(); } else { m_children[i] = children[i]; } const_cast(m_children[i])->setParent(this); } } DynamicLayoutHierarchy::~DynamicLayoutHierarchy() { if (m_children != nullptr) { for (int i = 0; i < m_numberOfChildren; i++) { if (m_children[i] != nullptr) { delete m_children[i]; } } } delete[] m_children; } void DynamicLayoutHierarchy::mergeChildrenAtIndex(DynamicLayoutHierarchy * eL, int index, bool removeEmptyChildren) { int indexOfEL = indexOfChild(eL); if (indexOfEL >= 0) { removeChildAtIndex(indexOfEL, false); } addChildrenAtIndex(eL->children(), eL->numberOfChildren(), index, removeEmptyChildren); eL->detachChildren(); delete eL; } void DynamicLayoutHierarchy::addChildrenAtIndex(const ExpressionLayout * const * operands, int numberOfOperands, int indexForInsertion, bool removeEmptyChildren) { assert(numberOfOperands > 0); const ExpressionLayout ** newOperands = new const ExpressionLayout * [m_numberOfChildren+numberOfOperands]; int currentIndex = 0; assert(indexForInsertion <= m_numberOfChildren); for (int i=0; iisEmpty() || (i < numberOfOperands-1 && operands[i+1]->mustHaveLeftBrother())) { const_cast(operands[i])->setParent(this); newOperands[currentIndex++] = operands[i]; } } for (int i=indexForInsertion; i= 0 && index <= m_numberOfChildren); const ExpressionLayout ** newChildren = new const ExpressionLayout * [m_numberOfChildren+1]; int j = 0; for (int i=0; i<=m_numberOfChildren; i++) { if (i == index) { child->setParent(this); newChildren[i] = child; } else { newChildren[i] = m_children[j++]; } } delete[] m_children; m_children = newChildren; m_numberOfChildren += 1; m_sized = false; m_positioned = false; m_baselined = false; return true; } void DynamicLayoutHierarchy::removeChildAtIndex(int index, bool deleteAfterRemoval) { if (deleteAfterRemoval) { delete m_children[index]; } else { const_cast(m_children[index])->setParent(nullptr); } m_numberOfChildren--; for (int j=index; jisEmpty())) { return true; } return false; } }