00001
00012
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
00065
00066
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 );
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 );
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 }