00001
00012
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016
00017 #include "BinsBaseXML.h"
00018
00019 #include "BinnerAxisXML.h"
00020 #include "XmlElement.h"
00021
00022 #include "binners/BinsBase.h"
00023 #include "binners/BinsFactory.h"
00024
00025 #include <cassert>
00026
00027 using std::list;
00028 using std::string;
00029
00030 namespace hippodraw {
00031
00032 BinsBaseXML::BinsBaseXML ( XmlController * controller )
00033 : BaseXML ( "BinsBase", controller ),
00034 m_axis ( "axis" )
00035 {
00036 m_binnerXML = new BinnerAxisXML ( controller );
00037 }
00038
00039 BinsBaseXML::
00040 ~BinsBaseXML ()
00041 {
00042 delete m_binnerXML;
00043 }
00044
00045 XmlElement *
00046 BinsBaseXML::
00047 createElement ( const BinsBase & bins )
00048 {
00049 XmlElement * tag = BaseXML::createElement ();
00050 const string & type = bins.name();
00051 tag->setAttribute ( m_type, type );
00052
00053 createChildren ( *tag, bins );
00054
00055 return tag;
00056 }
00057
00058
00059 void
00060 BinsBaseXML::
00061 createChildren ( XmlElement & tag, const BinsBase & bins )
00062 {
00063 const BinnerAxis * binner = bins.getBinnerOn ( Axes::X );
00064 XmlElement * element = m_binnerXML->createElement ( *binner );
00065 string axis ( "X" );
00066 element->setAttribute ( m_axis, axis );
00067 tag.appendChild ( *element );
00068 delete element;
00069
00070 int number = bins.getNumberOfAxes ();
00071 if ( number < 2 ) return;
00072
00073 binner = bins.getBinnerOn ( Axes::Y );
00074 element = m_binnerXML->createElement ( *binner );
00075 axis = "Y";
00076 element->setAttribute ( m_axis, axis );
00077 tag.appendChild ( *element );
00078 delete element;
00079 }
00080
00081 BinsBase *
00082 BinsBaseXML::
00083 createObject ( const XmlElement * binsbase )
00084 {
00085 string type;
00086 bool ok = binsbase->attribute ( m_type, type );
00087 assert ( ok );
00088
00089 BinsFactory * factory = BinsFactory::instance ();
00090 BinsBase * bins = factory->create ( type );
00091
00092 list < XmlElement * > nodelist;
00093 m_binnerXML->fillNodeList ( binsbase, nodelist );
00094
00095 list < XmlElement * > :: const_iterator first = nodelist.begin();
00096 while ( first != nodelist.end() ) {
00097 XmlElement * element = *first++;
00098 BinnerAxis * binner = m_binnerXML->createObject ( element );
00099 string axis;
00100 bool ok = element->attribute ( m_axis, axis );
00101 assert ( ok );
00102
00103 Axes::Type type = axis == "X" ? Axes::X : Axes::Y;
00104 bins->setBinnerOn ( binner, type );
00105 }
00106
00107 return bins;
00108 }
00109
00110 }
00111