AxisModelXML.cxx

Go to the documentation of this file.
00001 
00012 // for iterator member defect
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016 
00017 #include "AxisModelXML.h"
00018 
00019 #include "AxisTickXML.h"
00020 #include "XmlElement.h"
00021 
00022 #include "axes//AxisModelBase.h"
00023 #include "axes//AxisTick.h"
00024 
00025 #include <cassert>
00026 
00027 using std::string;
00028 using std::vector;
00029 
00030 namespace hippodraw {
00031 
00032 AxisModelXML::AxisModelXML ( XmlController * controller )
00033   : BaseXML ( "AxisModel", controller ),
00034     m_autorange ( "autorange" ),
00035     m_low ( "low" ),
00036     m_high ( "high" ),
00037     m_scale_factor ( "scale_factor" ),
00038     m_log ( "log" ),
00039     m_auto_tick ( "autotick" )
00040 {
00041   m_axistick_xml = new AxisTickXML ( controller );
00042 }
00043 
00044 AxisModelXML::
00045 ~AxisModelXML ()
00046 {
00047   delete m_axistick_xml;
00048 }
00049 
00050 void AxisModelXML::setAttributes ( XmlElement & tag,
00051                                    const AxisModelBase & model )
00052 {
00053   bool yes = model.isAutoRanging ();
00054   if ( yes ) {
00055     tag.setAttribute ( m_autorange, 1 );
00056   }
00057   else {
00058     tag.setAttribute ( m_autorange, 0 );
00059   }
00060   const Range & range = model.getRange ( false );
00061   tag.setAttribute ( m_low,  range.low()  );
00062   tag.setAttribute ( m_high, range.high() );
00063 
00064   tag.setAttribute ( m_scale_factor, model.getScaleFactor () );
00065 
00066   if ( model.isLog () == true ) {
00067     tag.setAttribute ( m_log, 1 );
00068   }
00069 
00070   yes = model.isAutoTicks ();
00071   if ( yes ) {
00072     tag.setAttribute ( m_auto_tick, 1 );
00073   }
00074   else {
00075     tag.setAttribute ( m_auto_tick, 0 );
00076     createChildren ( tag, model );
00077   }
00078 }
00079 
00080 void
00081 AxisModelXML::
00082 createChildren ( XmlElement & tag, const AxisModelBase & model )
00083 {
00084   const vector < AxisTick > & ticks = model.getTicks ();
00085   unsigned int size = ticks.size ();
00086   for ( unsigned int i = 0; i < size; i++ ) {
00087     const AxisTick & tick = ticks [ i ];
00088     XmlElement * element = m_axistick_xml -> createElement ();
00089     m_axistick_xml -> setAttributes ( *element, tick );
00090     tag.appendChild ( *element );
00091     delete element;
00092   }
00093 }
00094 
00095 Axes::Type 
00096 AxisModelXML::
00097 getAxis ( const XmlElement * element, 
00098           const std::string & tagname )
00099 {
00100   string value;
00101   bool ok = element->attribute ( tagname, value );
00102   assert ( ok );
00103 
00104   return Axes::convert ( value );
00105 }
00106 
00107 bool AxisModelXML::isLog ( const XmlElement * element )
00108 {
00109   int value;
00110   bool ok = element->attribute ( m_log, value );
00111   if ( ok && value != 0 ) return true;
00112 
00113   return false;
00114 }
00115 
00116 void AxisModelXML::setAttributes ( AxisModelBase * model,
00117                                    const XmlElement * element )
00118 
00119 {
00120   int value;
00121   bool ok = element->attribute ( m_autorange, value );
00122   if ( ok && ( value == 0 ) )  model->setAutoRanging  ( false );
00123 
00124   double low = 0.0;
00125   ok = element->attribute ( m_low, low );
00126   double high = 0.0;
00127   ok = element->attribute ( m_high, high );
00128 
00129   Range range ( low, high );
00130 
00131   model->setRange ( range, false );
00132 
00133   double scale_factor;
00134   ok = element->attribute ( m_scale_factor, scale_factor );
00135   if ( ok ) model->setScaleFactor ( scale_factor );
00136 
00137   ok = element -> attribute ( m_auto_tick, value );
00138   if ( ok ) {
00139     bool yes = value != 0;
00140     model -> setAutoTicks ( yes );
00141     if ( ! yes ) {
00142       createChildren ( element, model );
00143     }
00144   }
00145 }
00146 
00147 void
00148 AxisModelXML::
00149 createChildren ( const XmlElement * element, AxisModelBase * model )
00150 {
00151   vector < AxisTick > ticks;
00152   AxisTick tick;
00153 
00154   NodeList_t nodelist;
00155   m_axistick_xml -> fillNodeList ( element, nodelist );
00156   if ( nodelist.empty () == false ) {
00157     NodeList_t :: const_iterator first = nodelist.begin ();
00158     while ( first != nodelist.end() ) {
00159       XmlElement * element = *first++;
00160       m_axistick_xml -> setAttributes ( & tick, element );
00161       ticks.push_back ( tick );
00162     }
00163     model -> setTicks ( ticks );
00164   }
00165 }
00166 
00167 } // namespace hippodraw
00168 

Generated for HippoDraw Class Library by doxygen