Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

DataRepController.cxx

Go to the documentation of this file.
00001 
00012 // inconsistent dll linkage
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016 
00017 #include "DataRepController.h"
00018 
00019 #include "datareps/DataRepException.h"
00020 #include "datareps/DataRepFactory.h"
00021 #include "datareps/FunctionRep.h"
00022 
00023 #include "datasrcs/DataSourceException.h"
00024 #include "datasrcs/NTuple.h"
00025 
00026 #include "plotters/PlotterBase.h"
00027 #include "projectors/NTupleProjector.h"
00028 
00029 #include <cassert>
00030 
00031 using std::string;
00032 using std::vector;
00033 
00034 DataRepController * DataRepController::s_instance = 0;
00035 
00036 DataRepController::DataRepController ( )
00037 {
00038 }
00039 
00040 DataRepController::~DataRepController ( )
00041 {
00042 }
00043 
00044 DataRepController * DataRepController::instance ( )
00045 {
00046   if ( s_instance == 0 ) {
00047     s_instance = new DataRepController ( );
00048   }
00049   return s_instance;
00050 }
00051 
00052 const vector< string > & 
00053 DataRepController::bindingOptions ( const std::string & name )
00054 {
00055   DataRepFactory * factory = DataRepFactory::instance ();
00056   DataRep * datarep = factory->prototype ( name );
00057 
00058   return bindingOptions ( datarep );
00059 }
00060 
00061 const vector < string > & 
00062 DataRepController::bindingOptions ( DataRep * datarep )
00063 {
00064   // Binding options only make sense for something related to a
00065   // NTupleProjector. If the downcast doesn't work, this function
00066   // return an empty vector to indicate that.
00067   ProjectorBase * pbase = datarep->getProjector ();
00068   NTupleProjector * ntProjector = dynamic_cast <NTupleProjector *> ( pbase );
00069   if ( ntProjector == 0 ) return m_null_vector;
00070 
00071   return ntProjector->bindingOptions ();
00072 }
00073 
00074 bool DataRepController::
00075 checkBindings ( const DataSource * ntuple,
00076                 const std::vector < std::string > & bindings ) const
00077 {
00078   if ( ntuple == 0 ) return false;
00079 
00080   bool yes = true;
00081   vector < string > ::const_iterator first = bindings.begin ();
00082   while ( first != bindings.end() ) {
00083     const string & label = *first++;
00084     if ( label == "nil" ) continue;
00085     ntuple -> throwIfInvalidLabel ( label );
00086   }
00087 
00088   return yes;
00089 }
00090 
00091 DataRep *
00092 DataRepController::
00093 createDataRep ( const std::string & type )
00094 {
00095   DataRep * rep = 0;
00096   DataRepFactory * factory = DataRepFactory::instance ();
00097   try {
00098     rep = factory -> create ( type ); // let exception be thrown
00099   }
00100   catch ( const FactoryException & e ) {
00101     const string what = e.what ();
00102     throw DataRepException ( what );
00103   }
00104   ProjectorBase * projector = rep -> getProjector ();
00105   projector -> addObserver ( rep );
00106 
00107   return rep;
00108 }
00109                                 
00110 DataRep * 
00111 DataRepController::
00112 createDataRep ( const std::string & type,
00113                 const DataSource * tuple,
00114                 const std::vector < std::string > & bindings ) const
00115 {
00116   bool ok = checkBindings ( tuple, bindings );
00117   if ( !ok ) return 0;
00118 
00119   DataRepFactory * factory = DataRepFactory::instance ();
00120   DataRep * rep = factory->create ( type ); // let the exception be thrown
00121 
00122   setAxisBindings ( rep, tuple, bindings );
00123 
00124   return rep;
00125 }
00126 
00127 void
00128 DataRepController::
00129 setAxisBindings ( DataRep * rep,
00130                   const DataSource * tuple,
00131                   const std::vector < std::string > & bindings ) const
00132 {
00133   NTupleProjector * ntProjector =
00134     dynamic_cast < NTupleProjector * > ( rep->getProjector() );
00135 
00136   ntProjector->setNTuple ( tuple );
00137   DataSource * nt = const_cast < DataSource * > ( tuple );
00138   nt->addObserver ( ntProjector );
00139   rep->setAxisBindings ( bindings );
00140 
00141   ntProjector->addObserver ( rep );
00142 }
00143 
00144 void
00145 DataRepController::
00146 changeDataSource ( DataRep * rep, const DataSource * tuple )
00147 {
00148   ProjectorBase * pb = rep -> getProjector ();
00149   NTupleProjector * projector = dynamic_cast < NTupleProjector * > ( pb );
00150   assert ( projector != 0 );
00151 
00152   DataSource * source = projector -> getNTuple ();
00153   source -> removeObserver ( rep );
00154 
00155   const vector < string > & bindings = projector -> getAxisBindings ();
00156 
00157   try {
00158     setAxisBindings ( rep, tuple, bindings );
00159   }
00160   catch ( const DataSourceException & e ) {
00161     setAxisBindings ( rep, source, bindings );
00162     throw e;
00163   }
00164 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3