00001 #include "DisplayManager.h"
00002 #include "DisplayInfo.h"
00003 #include "Exceptions.h"
00004 #include "Displayer.h"
00005 #include "Sct/Serializable.h"
00006 #include "Sct/LogicErrors.h"
00007 #include "TROOT.h"
00008 #include "TCanvas.h"
00009 #include "TSeqCollection.h"
00010
00011 using namespace Sct;
00012
00013 namespace SctDataDisplay {
00014
00015 DisplayManager::DisplayManager() {
00016 m_batchMode=false;
00017 }
00018
00019 DisplayManager& DisplayManager::instance() {
00020 static DisplayManager disp;
00021 return disp;
00022 }
00023
00024 bool DisplayManager::addToMap(string className, shared_ptr<Displayer> displayer) {
00025 if (instance().displayerMap.find(className) != instance().displayerMap.end()) return false;
00026 instance().displayerMap[className] = displayer;
00027 return true;
00028 }
00029
00030 shared_ptr<DisplayData> DisplayManager::display(shared_ptr<const Serializable> ob, const DisplayInfo& info, std::ostream& os) {
00031 if (!ob)
00032 throw InvalidArgumentError("Passed a null pointer to DisplayManager::display", __FILE__, __LINE__);
00033
00034 if (instance().displayerMap.find(ob->getClassName()) == instance().displayerMap.end()) {
00035 for (unsigned int i=0; i<instance().genericList.size(); ++i) {
00036 if (instance().genericList[i]->canDisplay(*ob))
00037 return instance().genericList[i]->display(ob, info, os);
00038 }
00039
00040 throw NoDisplayerException("No Displayer for class: " + ob->getClassName(), __FILE__, __LINE__);
00041 }
00042
00043 return instance().displayerMap[ob->getClassName()]->display(ob, info, os);
00044 }
00045
00046
00047 bool DisplayManager::addGeneric(shared_ptr<GenericDisplayer> generic) {
00048 instance().genericList.push_back(generic);
00049 return true;
00050 }
00051
00052 bool DisplayManager::batchMode(){
00053 return instance().m_batchMode;
00054 }
00055
00056 void DisplayManager::setBatchMode(bool b){
00057 instance().m_batchMode=b;
00058 }
00059
00060 void DisplayManager::OutputCanvases(){
00061
00062 TSeqCollection* list = gROOT->GetListOfCanvases();
00063 for (int i=0; i<=list->LastIndex(); ++i){
00064 TCanvas* canvas=static_cast<TCanvas*>(list->At(i));
00065 string filename=canvas->GetName();
00066
00067 while (true) {
00068 unsigned ipos=filename.rfind(' ');
00069 std::cout << filename << ", " << ipos << std::endl;
00070 if (ipos==string::npos) break;
00071 filename[ipos]='_';
00072 }
00073
00074 canvas->Print((filename+".eps").c_str());
00075 }
00076 }
00077
00078 }