// Sets a list of properties as dirty. void ElementStyle::DirtyProperties(const PropertyNameList& properties) { if (properties.empty()) return; PropertyNameList inherited_properties; for (PropertyNameList::const_iterator i = properties.begin(); i != properties.end(); ++i) { // If this property is an inherited property, then push it into the list to be passed onto our children. const PropertyDefinition* property = StyleSheetSpecification::GetProperty(*i); if (property != NULL && property->IsInherited()) inherited_properties.insert(*i); } // Pass the list of those properties that are inherited onto our children. if (!inherited_properties.empty()) { for (int i = 0; i < element->GetNumChildren(true); i++) element->GetChild(i)->GetStyle()->DirtyInheritedProperties(inherited_properties); } // And send the event. element->OnPropertyChange(properties); }
// Dirties em-relative properties. void ElementStyle::DirtyEmProperties() { PropertyNameList properties; StyleSheetSpecification::GetRegisteredProperties(properties); // Check if any of these are currently em-relative. If so, dirty them. PropertyNameList em_properties; for (PropertyNameList::iterator list_iterator = properties.begin(); list_iterator != properties.end(); ++list_iterator) { // Skip font-size; this is relative to our parent's em, not ours. if (*list_iterator == FONT_SIZE) continue; // Get this element from this element. If this is em-relative, then add it to the list to // dirty. if (element->GetProperty(*list_iterator)->unit == Property::EM) em_properties.insert(*list_iterator); } if (!em_properties.empty()) DirtyProperties(em_properties); // Now dirty all of our descendant's font-size properties that are relative to ems. int num_children = element->GetNumChildren(true); for (int i = 0; i < num_children; ++i) element->GetChild(i)->GetStyle()->DirtyInheritedEmProperties(); }
// Sets a list of properties as dirty. void ElementStyle::DirtyProperties(const PropertyNameList& properties, bool clear_em_properties) { if (properties.empty()) return; bool all_inherited_dirty = StyleSheetSpecification::GetRegisteredProperties() == properties || StyleSheetSpecification::GetRegisteredInheritedProperties() == properties; if (all_inherited_dirty) { const PropertyNameList &all_inherited_properties = StyleSheetSpecification::GetRegisteredInheritedProperties(); for (int i = 0; i < element->GetNumChildren(true); i++) element->GetChild(i)->GetStyle()->DirtyInheritedProperties(all_inherited_properties); // Clear all cached properties. cache->Clear(); } else { PropertyNameList inherited_properties; for (PropertyNameList::const_iterator i = properties.begin(); i != properties.end(); ++i) { // If this property is an inherited property, then push it into the list to be passed onto our children. const PropertyDefinition* property = StyleSheetSpecification::GetProperty(*i); if (property != NULL && property->IsInherited()) inherited_properties.insert(*i); } // Pass the list of those properties that are inherited onto our children. if (!inherited_properties.empty()) { for (int i = 0; i < element->GetNumChildren(true); i++) element->GetChild(i)->GetStyle()->DirtyInheritedProperties(inherited_properties); } // Clear cached properties. cache->Clear(); } // clear the list of EM-properties, we will refill it in DirtyEmProperties if (clear_em_properties && em_properties != NULL) { delete em_properties; em_properties = NULL; } // And send the event. element->OnPropertyChange(properties); }
// Sets a list of our potentially inherited properties as dirtied by an ancestor. void ElementStyle::DirtyInheritedProperties(const PropertyNameList& properties) { PropertyNameList inherited_properties; for (PropertyNameList::const_iterator i = properties.begin(); i != properties.end(); ++i) { if (GetLocalProperty((*i)) == NULL) inherited_properties.insert(*i); } if (inherited_properties.empty()) return; // Pass the list of those properties that this element doesn't override onto our children. for (int i = 0; i < element->GetNumChildren(true); i++) element->GetChild(i)->GetStyle()->DirtyInheritedProperties(inherited_properties); element->OnPropertyChange(properties); }
// Sets a list of our potentially inherited properties as dirtied by an ancestor. void ElementStyle::DirtyInheritedProperties(const PropertyNameList& properties) { bool clear_em_properties = em_properties != NULL; PropertyNameList inherited_properties; for (PropertyNameList::const_iterator i = properties.begin(); i != properties.end(); ++i) { const Property *property = GetLocalProperty((*i)); if (property == NULL) { inherited_properties.insert(*i); if (!clear_em_properties && em_properties != NULL && em_properties->find((*i)) != em_properties->end()) { clear_em_properties = true; } } } if (inherited_properties.empty()) return; // clear the list of EM-properties, we will refill it in DirtyEmProperties if (clear_em_properties && em_properties != NULL) { delete em_properties; em_properties = NULL; } // Clear cached inherited properties. cache->ClearInherited(); // Pass the list of those properties that this element doesn't override onto our children. for (int i = 0; i < element->GetNumChildren(true); i++) element->GetChild(i)->GetStyle()->DirtyInheritedProperties(inherited_properties); element->OnPropertyChange(properties); }