ElementDefinition.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ROCKETCOREELEMENTDEFINITION_H
00029 #define ROCKETCOREELEMENTDEFINITION_H
00030
00031 #include <Rocket/Core/Dictionary.h>
00032 #include <Rocket/Core/ReferenceCountable.h>
00033 #include <map>
00034 #include <set>
00035 #include <Rocket/Core/FontEffect.h>
00036 #include "StyleSheetNode.h"
00037
00038 namespace Rocket {
00039 namespace Core {
00040
00041 class Decorator;
00042 class FontEffect;
00043
00044
00045
00046
00047
00048 typedef std::pair< StringList, Property > PseudoClassProperty;
00049 typedef std::vector< PseudoClassProperty > PseudoClassPropertyList;
00050 typedef std::map< String, PseudoClassPropertyList > PseudoClassPropertyDictionary;
00051
00052 typedef std::map< String, Decorator* > DecoratorMap;
00053 typedef std::map< StringList, DecoratorMap > PseudoClassDecoratorMap;
00054
00059 class ElementDefinition : public ReferenceCountable
00060 {
00061 public:
00062 enum PseudoClassVolatility
00063 {
00064 STABLE,
00065 FONT_VOLATILE,
00066 STRUCTURE_VOLATILE
00067 };
00068
00069 ElementDefinition();
00070 virtual ~ElementDefinition();
00071
00073 void Initialise(const std::vector< const StyleSheetNode* >& style_sheet_nodes, const PseudoClassList& volatile_pseudo_classes, bool structurally_volatile);
00074
00079 const Property* GetProperty(const String& name, const PseudoClassList& pseudo_classes) const;
00080
00085 void GetDefinedProperties(PropertyNameList& property_names, const PseudoClassList& pseudo_classes) const;
00091 void GetDefinedProperties(PropertyNameList& property_names, const PseudoClassList& pseudo_classes, const String& pseudo_class) const;
00092
00100 bool IterateProperties(int& index, const PseudoClassList& pseudo_classes, PseudoClassList& property_pseudo_classes, String& property_name, const Property*& property) const;
00101
00104 const DecoratorMap& GetDecorators() const;
00107 const PseudoClassDecoratorMap& GetPseudoClassDecorators() const;
00108
00113 void GetFontEffects(FontEffectMap& font_effects, const PseudoClassList& pseudo_classes) const;
00114
00118 PseudoClassVolatility GetPseudoClassVolatility(const String& pseudo_class) const;
00119
00123 bool IsStructurallyVolatile() const;
00124
00125 protected:
00127 void OnReferenceDeactivate();
00128
00129 private:
00130 typedef std::pair< String, PropertyDictionary > PropertyGroup;
00131 typedef std::map< String, PropertyGroup > PropertyGroupMap;
00132
00133 typedef std::vector< std::pair< StringList, int > > PseudoClassFontEffectIndex;
00134 typedef std::map< String, PseudoClassFontEffectIndex > FontEffectIndex;
00135
00136 typedef std::map< String, PseudoClassVolatility > PseudoClassVolatilityMap;
00137
00138
00139 void BuildPropertyGroup(PropertyGroupMap& groups, const String& group_type, const PropertyDictionary& element_properties, const PropertyGroupMap* default_properties = NULL);
00140
00141 int BuildPropertyGroupDictionary(PropertyDictionary& group_properties, const String& group_type, const String& group_name, const PropertyDictionary& element_properties);
00142
00143
00144
00145 void InstanceDecorators(const PseudoClassPropertyMap& merged_pseudo_class_properties);
00146
00147 bool InstanceDecorator(const String& name, const String& type, const PropertyDictionary& properties, const StringList& pseudo_class = StringList());
00148
00149
00150
00151 void InstanceFontEffects(const PseudoClassPropertyMap& merged_pseudo_class_properties);
00152
00153 bool InstanceFontEffect(const String& name, const String& type, const PropertyDictionary& properties, const StringList& pseudo_class = StringList());
00154
00155
00156 bool IsPseudoClassRuleApplicable(const StringList& rule_pseudo_classes, const PseudoClassList& element_pseudo_classes) const;
00157
00158
00159 PropertyDictionary properties;
00160
00161 PseudoClassPropertyDictionary pseudo_class_properties;
00162
00163
00164 DecoratorMap decorators;
00165
00166 PseudoClassDecoratorMap pseudo_class_decorators;
00167
00168
00169 FontEffectList font_effects;
00170
00171
00172 FontEffectIndex font_effect_index;
00173
00174
00175 PseudoClassVolatilityMap pseudo_class_volatility;
00176
00177
00178 bool structurally_volatile;
00179 };
00180
00181 }
00182 }
00183
00184 #endif