}\r
\r
bool VBufBackend_t::invalidateSubtree(VBufStorage_controlFieldNode_t* node) {\r
+ VBufStorage_controlFieldNode_t* updateAncestor=node->getUpdateAncestor();\r
+ if(updateAncestor) node=updateAncestor;\r
if(!isNodeInBuffer(node)) {\r
LOG_DEBUGWARNING(L"Node at "<<node<<L" not in buffer at "<<this);\r
return false;\r
LOG_DEBUG(L"Disassociating fieldNode from buffer");\r
}\r
\r
-VBufStorage_fieldNode_t::VBufStorage_fieldNode_t(int lengthArg, bool isBlockArg): parent(NULL), previous(NULL), next(NULL), firstChild(NULL), lastChild(NULL), length(lengthArg), isBlock(isBlockArg), isHidden(false), attributes() {\r
+VBufStorage_fieldNode_t::VBufStorage_fieldNode_t(int lengthArg, bool isBlockArg): parent(NULL), previous(NULL), next(NULL), firstChild(NULL), lastChild(NULL), length(lengthArg), isBlock(isBlockArg), isHidden(false), updateAncestor(NULL), attributes() {\r
LOG_DEBUG(L"field node initialization at "<<this<<L"length is "<<length);\r
}\r
\r
return parent;\r
}\r
\r
+VBufStorage_controlFieldNode_t* VBufStorage_fieldNode_t::getUpdateAncestor() {\r
+ LOG_DEBUG(L"updateAncestor at "<<updateAncestor);\r
+ return updateAncestor;\r
+}\r
+\r
VBufStorage_fieldNode_t* VBufStorage_fieldNode_t::getPrevious() {\r
LOG_DEBUG(L"previous at "<<previous);\r
return previous;\r
this->isHidden=isHidden;\r
}\r
\r
+void VBufStorage_fieldNode_t::setUpdateAncestor(VBufStorage_controlFieldNode_t* node) {\r
+ this->updateAncestor=node;\r
+}\r
+\r
int VBufStorage_fieldNode_t::getLength() {\r
return this->length;\r
}\r
bool isHidden;\r
\r
/**\r
+ * points to an optional ancestor node which should be re-rendered instead of this node, if this node changes.\r
+ */\r
+ VBufStorage_controlFieldNode_t* updateAncestor;\r
+\r
+ /**\r
* a map to hold attributes for this field.\r
*/\r
VBufStorage_attributeMap_t attributes;\r
void setIsHidden(bool isHidden);\r
\r
/**\r
+ * points to an optional ancestor node which should be re-rendered instead of this node, if this node changes.\r
+ */\r
+ VBufStorage_controlFieldNode_t* getUpdateAncestor();\r
+\r
+/**\r
+ * points to an optional ancestor node which should be re-rendered instead of this node, if this node changes.\r
+ */\r
+ void setUpdateAncestor(VBufStorage_controlFieldNode_t* updateAncestor);\r
+\r
+/**\r
* Getter for isBlock\r
*/\r
bool getIsBlock() {\r