diff --git a/src/parser/ParserEventDecoder.cpp b/src/parser/ParserEventDecoder.cpp index b3c2e9fdd711f2162901ad4e9d04b222af6c0c26..00965aac19dbee7230b04cfe38766bf50f1bac07 100644 --- a/src/parser/ParserEventDecoder.cpp +++ b/src/parser/ParserEventDecoder.cpp @@ -25,7 +25,7 @@ void ParserEventDecoder::store_event(const Definition &definition, Line &line, T String dest_container; String key; - vector<Value *> extra_fields; + map<std::string, Value *> extra_fields; unsigned int i = 1; vector<Field> fields = definition.get_fields(); @@ -109,8 +109,7 @@ void ParserEventDecoder::store_event(const Definition &definition, Line &line, T else { if(fields[i-1]._type == "string") { - String value = current_value; - extra_fields.push_back(&value); + extra_fields[fields[i-1]._name] = new String(current_value); } else if(fields[i-1]._type == "double") { Double value; @@ -119,7 +118,7 @@ void ParserEventDecoder::store_event(const Definition &definition, Line &line, T //cerr << "warning : incompatible value : " << current_value << endl; return; } - extra_fields.push_back(&value); + extra_fields[fields[i-1]._name] = new Double(value); } else if(fields[i-1]._type == "hex") { Hex value; @@ -128,7 +127,7 @@ void ParserEventDecoder::store_event(const Definition &definition, Line &line, T //cerr << "warning : incompatible value : " << current_value << endl; return; } - extra_fields.push_back(&value); + extra_fields[fields[i-1]._name] = new Hex(value); } else if(fields[i-1]._type == "date") { Date value; @@ -137,7 +136,7 @@ void ParserEventDecoder::store_event(const Definition &definition, Line &line, T //cerr << "warning : incompatible value : " << current_value << endl; return; } - extra_fields.push_back(&value); + extra_fields[fields[i-1]._name] = new Date(value); } else if(fields[i-1]._type == "int") { Integer value; @@ -146,7 +145,7 @@ void ParserEventDecoder::store_event(const Definition &definition, Line &line, T //cerr << "warning : incompatible value : " << current_value << endl; return; } - extra_fields.push_back(&value); + extra_fields[fields[i-1]._name] = new Integer(value); } else if(fields[i-1]._type == "color") { Color value; @@ -155,7 +154,7 @@ void ParserEventDecoder::store_event(const Definition &definition, Line &line, T //cerr << "warning : incompatible value : " << current_value << endl; return; } - extra_fields.push_back(&value); + extra_fields[fields[i-1]._name] = new Color(value); } else { Error::set_and_print_warning(Error::_UNKNOWN_TYPE_IN_EVENT + current_value, line.get_line_count()); diff --git a/src/trace/DrawTrace.hpp b/src/trace/DrawTrace.hpp index 2fd7206a8ffde6ccdb913ae0b99de16ce17b3668..8855bdcb5a3d995a1d9847163e1a3da4ce7f65c3 100644 --- a/src/trace/DrawTrace.hpp +++ b/src/trace/DrawTrace.hpp @@ -294,6 +294,8 @@ public: Event *event; const list<Link *> *link_list; Link *link; + const map<std::string, Value *> *extra_fields; + const Color *color; Element_count i;/* for the level (y axis) of the states */ i = 0; @@ -308,8 +310,21 @@ public: state = *it; Element_pos base = ((Element_pos)i)*_container_height+((Element_pos)i)*_container_v_space+_container_v_space; - /* Call the object state drawing function */ - draw_object->draw_state(state->get_start_time().get_value(), state->get_end_time().get_value(), base, _state_height, 0.7, 0.7, 0.75); + + // Search the color + extra_fields = state->get_value()->get_extra_fields(); + map<std::string, Value *>::const_iterator field = extra_fields->find(std::string("Color")); + if (field == extra_fields->end()) { + /* Call the object state drawing function with default color */ + draw_object->draw_state(state->get_start_time().get_value(), state->get_end_time().get_value(), base, _state_height, 0.7, 0.7, 0.75); + } + else { + /* Call the object state drawing function with the state color */ + color = (const Color *)(*field).second; + draw_object->draw_state(state->get_start_time().get_value(), state->get_end_time().get_value(), + base, _state_height, + color->get_red(), color->get_green(), color->get_blue()); + } }/* end for */ // Browse events diff --git a/src/trace/EntityValue.cpp b/src/trace/EntityValue.cpp index 384ab1a42ee34f6dfc2fc9f273868d16e2b27fd0..49caca65caa02762da2b606522d7a8685a1199a9 100644 --- a/src/trace/EntityValue.cpp +++ b/src/trace/EntityValue.cpp @@ -1,6 +1,6 @@ #include "EntityValue.hpp" -EntityValue::EntityValue(const Name &name, EntityType *type): _name(name), _type(type) { +EntityValue::EntityValue(const Name &name, EntityType *type, map<std::string, Value *> opt): _name(name), _type(type), _opt(opt) { } @@ -11,3 +11,8 @@ Name EntityValue::get_name() const { const EntityType *EntityValue::get_type() const { return _type; } + +const map<std::string, Value *> *EntityValue::get_extra_fields() const { + return &_opt; +} + diff --git a/src/trace/EntityValue.hpp b/src/trace/EntityValue.hpp index 27d95aa4b3e7a381235e1a36d4eed8d83c5ab454..68e9355d2e402d11b5697ef59dee854178e6e90b 100644 --- a/src/trace/EntityValue.hpp +++ b/src/trace/EntityValue.hpp @@ -10,6 +10,10 @@ * */ +#include "values/Value.hpp" +#include <map> +using std::map; + class EntityValue; #include "EntityType.hpp" @@ -24,12 +28,14 @@ class EntityValue { private: Name _name; EntityType *_type; + map<std::string, Value *> _opt; public: - EntityValue(const Name &name, EntityType *type); + EntityValue(const Name &name, EntityType *type, map<std::string, Value *> opt); Name get_name() const; const EntityType *get_type() const; + const map<std::string, Value *> *get_extra_fields() const; }; #endif diff --git a/src/trace/Trace.cpp b/src/trace/Trace.cpp index 78f713eca838f48b2aacf5a2e6cfae4a9432d235..79a42e29b1565a07016d1d8e78d0fe5994c69e81 100644 --- a/src/trace/Trace.cpp +++ b/src/trace/Trace.cpp @@ -16,7 +16,7 @@ Trace::~Trace() { } } -void Trace::define_container_type(Name &name, ContainerType *parent, const vector<Value *> &opt) { +void Trace::define_container_type(Name &name, ContainerType *parent, const map<std::string, Value *> &opt) { ContainerType *type = new ContainerType(name, parent); if (parent) parent->add_child(type); @@ -24,7 +24,7 @@ void Trace::define_container_type(Name &name, ContainerType *parent, const vecto _root_container_types.push_back(type); } -void Trace::create_container(Date &time, Name &name, ContainerType *type, Container *parent, const vector<Value *> &opt) { +void Trace::create_container(Date &time, Name &name, ContainerType *type, Container *parent, const map<std::string, Value *> &opt) { if (!type) return; @@ -35,73 +35,73 @@ void Trace::create_container(Date &time, Name &name, ContainerType *type, Contai _root_containers.push_back(cont); } -void Trace::destroy_container(Date &time, Container *cont, ContainerType *type, const vector<Value *> &opt) { +void Trace::destroy_container(Date &time, Container *cont, ContainerType *type, const map<std::string, Value *> &opt) { if (cont) cont->destroy(time); } -void Trace::define_event_type(Name &name, ContainerType *container_type, const vector<Value *> &opt) { +void Trace::define_event_type(Name &name, ContainerType *container_type, const map<std::string, Value *> &opt) { if (container_type) _event_types.push_back(new EventType(name, container_type)); } -void Trace::define_state_type(Name &name, ContainerType *container_type, const vector<Value *> &opt) { +void Trace::define_state_type(Name &name, ContainerType *container_type, const map<std::string, Value *> &opt) { if (container_type) _state_types.push_back(new StateType(name, container_type)); } -void Trace::define_variable_type(Name &name, ContainerType *container_type, const vector<Value *> &opt) { +void Trace::define_variable_type(Name &name, ContainerType *container_type, const map<std::string, Value *> &opt) { } -void Trace::define_link_type(Name &name, ContainerType *ancestor, ContainerType *source, ContainerType *destination, const vector<Value *> &opt) { +void Trace::define_link_type(Name &name, ContainerType *ancestor, ContainerType *source, ContainerType *destination, const map<std::string, Value *> &opt) { if (ancestor) _link_types.push_back(new LinkType(name, ancestor, source, destination)); } -void Trace::define_entity_value(Name &name, EntityType *entity_type, const vector<Value *> &opt) { +void Trace::define_entity_value(Name &name, EntityType *entity_type, const map<std::string, Value *> &opt) { if (entity_type) - entity_type->add_value(new EntityValue(name, entity_type)); + entity_type->add_value(new EntityValue(name, entity_type, opt)); } -void Trace::set_state(Date &time, StateType *type, Container *container, EntityValue *value, const vector<Value *> &opt) { +void Trace::set_state(Date &time, StateType *type, Container *container, EntityValue *value, const map<std::string, Value *> &opt) { if (container && type && value) container->set_state(time, type, value); } -void Trace::push_state(Date &time, StateType *type, Container *container, EntityValue *value, const vector<Value *> &opt) { +void Trace::push_state(Date &time, StateType *type, Container *container, EntityValue *value, const map<std::string, Value *> &opt) { if (container && type && value) container->push_state(time, type, value); } -void Trace::pop_state(Date &time, StateType *type, Container *container, const vector<Value *> &opt) { +void Trace::pop_state(Date &time, StateType *type, Container *container, const map<std::string, Value *> &opt) { if (container) container->pop_state(time); } -void Trace::new_event(Date &time, EventType *type, Container *container, EntityValue *value, const vector<Value *> &opt) { +void Trace::new_event(Date &time, EventType *type, Container *container, EntityValue *value, const map<std::string, Value *> &opt) { if (container) container->new_event(time, type, value); } -void Trace::set_variable(Date &time, VariableType *type, Container *container, Double value, const vector<Value *> &opt) { +void Trace::set_variable(Date &time, VariableType *type, Container *container, Double value, const map<std::string, Value *> &opt) { } -void Trace::add_variable(Date &time, VariableType *type, Container *container, Double value, const vector<Value *> &opt) { +void Trace::add_variable(Date &time, VariableType *type, Container *container, Double value, const map<std::string, Value *> &opt) { } -void Trace::sub_variable(Date &time, VariableType *type, Container *container, Double value, const vector<Value *> &opt) { +void Trace::sub_variable(Date &time, VariableType *type, Container *container, Double value, const map<std::string, Value *> &opt) { } -void Trace::start_link(Date &time, LinkType *type, Container *ancestor, Container *source, EntityValue *value, String key, const vector<Value *> &opt) { +void Trace::start_link(Date &time, LinkType *type, Container *ancestor, Container *source, EntityValue *value, String key, const map<std::string, Value *> &opt) { if (ancestor) ancestor->start_link(time, type, source, value, key); } -void Trace::end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, EntityValue *value, String key, const vector<Value *> &opt) { +void Trace::end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, EntityValue *value, String key, const map<std::string, Value *> &opt) { if (ancestor) ancestor->end_link(time, destination, key); } diff --git a/src/trace/Trace.hpp b/src/trace/Trace.hpp index ba41329e6f5a9f6568c03cc5f5955fa7897c2a84..b2e4ea8d078496bbe9837c478ae7def58ce8f1ab 100644 --- a/src/trace/Trace.hpp +++ b/src/trace/Trace.hpp @@ -66,7 +66,7 @@ public : *\param container_type_parent an object that can contain a name, an alias or both * */ - void define_container_type(Name &alias, ContainerType *container_type_parent, const vector<Value *> &opt); + void define_container_type(Name &alias, ContainerType *container_type_parent, const map<std::string, Value *> &opt); /*! * @@ -80,7 +80,7 @@ public : *\param String : the parent of the container * */ - void create_container(Date &time, Name &alias, ContainerType *type, Container *parent, const vector<Value *> &opt); + void create_container(Date &time, Name &alias, ContainerType *type, Container *parent, const map<std::string, Value *> &opt); /*! * @@ -92,7 +92,7 @@ public : *\param type the type of the container * */ - void destroy_container(Date &time, Container *cont, ContainerType *type, const vector<Value *> &opt); + void destroy_container(Date &time, Container *cont, ContainerType *type, const map<std::string, Value *> &opt); /*! @@ -104,7 +104,7 @@ public : *\param container_type the type of the container * */ - void define_event_type(Name &alias, ContainerType *container_type, const vector<Value *> &opt); + void define_event_type(Name &alias, ContainerType *container_type, const map<std::string, Value *> &opt); /*! @@ -117,7 +117,7 @@ public : * * */ - void define_state_type(Name &alias, ContainerType *container_type, const vector<Value *> &opt); + void define_state_type(Name &alias, ContainerType *container_type, const map<std::string, Value *> &opt); /*! @@ -129,7 +129,7 @@ public : *\param container_type the type of the container * */ - void define_variable_type(Name &alias, ContainerType *container_type, const vector<Value *> &opt); + void define_variable_type(Name &alias, ContainerType *container_type, const map<std::string, Value *> &opt); /*! @@ -143,7 +143,7 @@ public : *\param destination the type of the container where the link goes * */ - void define_link_type(Name &alias, ContainerType *ancestor, ContainerType *source, ContainerType *destination, const vector<Value *> &opt); + void define_link_type(Name &alias, ContainerType *ancestor, ContainerType *source, ContainerType *destination, const map<std::string, Value *> &opt); /*! @@ -155,7 +155,7 @@ public : *\param entity_type the type of the entity * */ - void define_entity_value(Name &alias, EntityType *entity_type, const vector<Value *> &opt); + void define_entity_value(Name &alias, EntityType *entity_type, const map<std::string, Value *> &opt); /*! @@ -169,7 +169,7 @@ public : *\param value the new value of the state * */ - void set_state(Date &time, StateType *type, Container *container, EntityValue *value, const vector<Value *> &opt); + void set_state(Date &time, StateType *type, Container *container, EntityValue *value, const map<std::string, Value *> &opt); /*! @@ -183,7 +183,7 @@ public : *\param String : the new value of the state * */ - void push_state(Date &time, StateType *type, Container *container, EntityValue *value, const vector<Value *> &opt); + void push_state(Date &time, StateType *type, Container *container, EntityValue *value, const map<std::string, Value *> &opt); /*! @@ -196,7 +196,7 @@ public : *\param container the container * */ - void pop_state(Date &time, StateType *type, Container *container, const vector<Value *> &opt); + void pop_state(Date &time, StateType *type, Container *container, const map<std::string, Value *> &opt); /*! @@ -210,7 +210,7 @@ public : *\param value the value of the event * */ - void new_event(Date &time, EventType *type, Container *container, EntityValue *value, const vector<Value *> &opt); + void new_event(Date &time, EventType *type, Container *container, EntityValue *value, const map<std::string, Value *> &opt); /*! @@ -224,7 +224,7 @@ public : *\param value the value of the variable * */ - void set_variable(Date &time, VariableType *type, Container *container, Double value, const vector<Value *> &opt); + void set_variable(Date &time, VariableType *type, Container *container, Double value, const map<std::string, Value *> &opt); /*! @@ -238,7 +238,7 @@ public : *\param value the value of the variable * */ - void add_variable(Date &time, VariableType *type, Container *container, Double value, const vector<Value *> &opt); + void add_variable(Date &time, VariableType *type, Container *container, Double value, const map<std::string, Value *> &opt); /*! @@ -252,7 +252,7 @@ public : *\param value the value of the variable * */ - void sub_variable(Date &time, VariableType *type, Container *container, Double value, const vector<Value *> &opt); + void sub_variable(Date &time, VariableType *type, Container *container, Double value, const map<std::string, Value *> &opt); /*! @@ -267,7 +267,7 @@ public : *\param value the value of the variable * */ - void start_link(Date &time, LinkType *type, Container *ancestor, Container *source, EntityValue *value, String key, const vector<Value *> &opt); + void start_link(Date &time, LinkType *type, Container *ancestor, Container *source, EntityValue *value, String key, const map<std::string, Value *> &opt); /*! @@ -282,7 +282,7 @@ public : *\param value the value of the variable * */ - void end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, EntityValue *value, String key, const vector<Value *> &opt); + void end_link(Date &time, LinkType *type, Container *ancestor, Container *destination, EntityValue *value, String key, const map<std::string, Value *> &opt); /*! diff --git a/src/trace/values/Color.cpp b/src/trace/values/Color.cpp index a608049cc9aeeb4716152a82fcd8597205476336..b6efcb5e7623ba36835f784b24df2e19f1a59397 100644 --- a/src/trace/values/Color.cpp +++ b/src/trace/values/Color.cpp @@ -60,4 +60,16 @@ bool Color::replace_in_string(std::string &characters, char to_replace, char rep } return has_change; +} + +double Color::get_red() const { + return _r; +} + +double Color::get_green() const { + return _g; +} + +double Color::get_blue() const { + return _b; } diff --git a/src/trace/values/Color.hpp b/src/trace/values/Color.hpp index 1567b570075e8b3a1685c0127a21c367d3dc24de..0738d4f20ee2496d76bcda589a245eb689af83d3 100644 --- a/src/trace/values/Color.hpp +++ b/src/trace/values/Color.hpp @@ -58,6 +58,30 @@ public: * */ std::string to_string() const; + + /*! + * + * \fn get_red() const + * \return red value + * + */ + double get_red() const; + + /*! + * + * \fn get_green() const; + * \return green value + * + */ + double get_green() const; + + /*! + * + * \fn get_blue() const; + * \return blue value + * + */ + double get_blue() const; private: /*!