CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/Fireworks/Core/src/FWModelContextMenuHandler.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     Core
00004 // Class  :     FWModelContextMenuHandler
00005 // 
00006 // Implementation:
00007 //     <Notes on implementation>
00008 //
00009 // Original Author:  Chris Jones
00010 //         Created:  Tue Sep 22 13:26:04 CDT 2009
00011 // $Id: FWModelContextMenuHandler.cc,v 1.26 2013/01/25 19:36:33 wmtan Exp $
00012 //
00013 
00014 // system include files
00015 #include <cassert>
00016 #include "TGMenu.h"
00017 #include "KeySymbols.h"
00018 
00019 #include "FWCore/Utilities/interface/FunctionWithDict.h"
00020 #include "FWCore/Utilities/interface/ObjectWithDict.h"
00021 #include "FWCore/Utilities/interface/TypeWithDict.h"
00022 #include "TClass.h"
00023 
00024 // user include files
00025 #include "Fireworks/Core/src/FWModelContextMenuHandler.h"
00026 #include "Fireworks/Core/interface/FWSelectionManager.h"
00027 #include "Fireworks/Core/interface/FWDetailViewManager.h"
00028 #include "Fireworks/Core/interface/FWColorManager.h"
00029 #include "Fireworks/Core/src/FWColorSelect.h"
00030 #include "Fireworks/Core/src/FWPopupMenu.cc"
00031 #include "Fireworks/Core/interface/FWEventItem.h"
00032 #include "Fireworks/Core/interface/FWGUIManager.h"
00033 #include "Fireworks/Core/interface/FWViewContextMenuHandlerBase.h"
00034 
00035 //
00036 // constants, enums and typedefs
00037 //
00038 enum MenuOptions {
00039    kSetVisibleMO,
00040    kSetColorMO,
00041    kPrint,
00042    kOpenDetailViewMO,
00043    kAfterOpenDetailViewMO,
00044    kOpenObjectControllerMO=100,
00045    kOpenCollectionControllerMO,
00046    kViewOptionsMO=1000,
00047    kLastOfMO
00048 };
00049 
00050 
00051 //
00052 // static data member definitions
00053 //
00054 static const char* const kOpenDetailView = "Open Detailed View ...";
00055 
00056 //
00057 // constructors and destructor
00058 //
00059 FWModelContextMenuHandler::FWModelContextMenuHandler(FWSelectionManager* iSM,
00060                                                      FWDetailViewManager* iDVM,
00061                                                      FWColorManager* iCM,
00062                                                      FWGUIManager* iGM):
00063 m_modelPopup(0),
00064 m_colorPopup(0),
00065 m_selectionManager(iSM),
00066 m_detailViewManager(iDVM),
00067 m_colorManager(iCM),
00068 m_guiManager(iGM),
00069 m_seperator(0),
00070 m_viewSeperator(0),
00071 m_afterViewSeperator(0),
00072 m_x(0),
00073 m_y(0),
00074 m_nDetailViewEntries(0),
00075 m_nViewEntries(0),
00076 m_viewHander(0)
00077 {
00078 }
00079 
00080 // FWModelContextMenuHandler::FWModelContextMenuHandler(const FWModelContextMenuHandler& rhs)
00081 // {
00082 //    // do actual copying here;
00083 // }
00084 
00085 FWModelContextMenuHandler::~FWModelContextMenuHandler()
00086 {
00087    delete m_modelPopup;
00088 }
00089 
00090 //
00091 // assignment operators
00092 //
00093 // const FWModelContextMenuHandler& FWModelContextMenuHandler::operator=(const FWModelContextMenuHandler& rhs)
00094 // {
00095 //   //An exception safe implementation is
00096 //   FWModelContextMenuHandler temp(rhs);
00097 //   swap(rhs);
00098 //
00099 //   return *this;
00100 // }
00101 
00102 //
00103 // member functions
00104 //
00105 #include "TROOT.h"
00106 namespace  {
00107    class change_visibility {
00108    public:
00109       change_visibility(bool iIsVisible): m_isVisible(iIsVisible) {}
00110       void operator()(const FWModelId& iID) const {
00111          FWDisplayProperties p = iID.item()->modelInfo(iID.index()).displayProperties();
00112          p.setIsVisible(m_isVisible);
00113          iID.item()->setDisplayProperties(iID.index(), p);
00114       }
00115       bool m_isVisible; 
00116    };
00117 }
00118 void 
00119 FWModelContextMenuHandler::chosenItem(Int_t iChoice)
00120 {
00121    assert(!m_selectionManager->selected().empty());
00122    switch (iChoice) {
00123       case kSetVisibleMO:
00124       {
00125          FWModelId id = *(m_selectionManager->selected().begin());
00126          const FWDisplayProperties& props = id.item()->modelInfo(id.index()).displayProperties();
00127          for_each(m_selectionManager->selected().begin(),
00128                   m_selectionManager->selected().end(), 
00129                   change_visibility(!props.isVisible())
00130                   );
00131          break;
00132       }
00133       case kSetColorMO:
00134       {
00135          FWModelId id = *(m_selectionManager->selected().begin());
00136          createColorPopup();
00137          m_colorPopup->SetName("Selected");
00138          std::vector<Color_t> colors;
00139          m_colorManager->fillLimitedColors(colors);
00140          m_colorPopup->ResetColors(colors, m_colorManager->backgroundColorIndex()==FWColorManager::kBlackIndex);
00141          m_colorPopup->SetSelection(id.item()->modelInfo(id.index()).displayProperties().color());
00142          m_colorPopup->PlacePopup(m_x, m_y, m_colorPopup->GetDefaultWidth(), m_colorPopup->GetDefaultHeight());
00143          break;
00144       }
00145       case kPrint:
00146       {
00147          FWModelId id = *(m_selectionManager->selected().begin());
00148          edm::TypeWithDict rtype(edm::TypeWithDict::byName(id.item()->modelType()->GetName()));
00149          edm::ObjectWithDict o(rtype, const_cast<void *>(id.item()->modelData(id.index())));
00150 
00151          // void* xx = &std::cout;
00152          //const std::vector<void*> j(1, xx);
00153          //edm::TypeMemberQuery inh =  edm::TypeMemberQuery::InheritedAlso;
00154          //edm::FunctionWithDict m = rtype.functionMemberByName("print",edm::TypeWithDict(edm::TypeWithDict::byName("void (std::ostream&)"), edm::TypeModifiers::Const), edm::TypeModifiers::NoMod , inh))
00155          //m.Invoke(o, 0, j);
00156 
00157          const char* cmd  = Form("FWGUIManager::OStream() << *(%s*)%p ;",  id.item()->modelType()->GetName(), (void*)id.item()->modelData(id.index()));
00158          //const char* cmd  = Form("*((std::ostream*)%p) << (%s*)%p ;", (void*)(&std::cout), id.item()->modelType()->GetName(), (void*)id.item()->modelData(id.index()));
00159          std::cout << cmd << std::endl;
00160          gROOT->ProcessLine(cmd);
00161 
00162 
00163          break;
00164       }
00165       case kOpenObjectControllerMO:
00166       {
00167          m_guiManager->showModelPopup();
00168          break;
00169       }
00170       case kOpenCollectionControllerMO:
00171       {
00172          m_guiManager->showEDIFrame();
00173          break;
00174       }
00175       case kOpenDetailViewMO:
00176       case kViewOptionsMO:
00177       default:
00178       {
00179          if(iChoice>=kViewOptionsMO) {
00180             assert(0!=m_viewHander);
00181             m_viewHander->select(iChoice-kViewOptionsMO, *(m_selectionManager->selected().begin()), m_x, m_y);
00182          }else {
00183             assert(iChoice<kOpenObjectControllerMO);
00184             assert(m_selectionManager->selected().size()==1);
00185             std::vector<std::string> viewChoices = m_detailViewManager->detailViewsFor(*(m_selectionManager->selected().begin()));
00186             assert(0!=viewChoices.size());
00187             m_detailViewManager->openDetailViewFor(*(m_selectionManager->selected().begin()),viewChoices[iChoice-kOpenDetailViewMO]) ;
00188          }
00189          break;
00190       }
00191       break;
00192    }
00193 }
00194 
00195 void 
00196 FWModelContextMenuHandler::colorChangeRequested(Color_t color)
00197 {
00198    for(std::set<FWModelId>::const_iterator it =m_selectionManager->selected().begin(),
00199        itEnd = m_selectionManager->selected().end();
00200        it != itEnd;
00201        ++it) {
00202       FWDisplayProperties changeProperties = it->item()->modelInfo(it->index()).displayProperties();
00203       changeProperties.setColor(color);
00204       it->item()->setDisplayProperties(it->index(), changeProperties);
00205    }
00206 }
00207 
00208 void 
00209 FWModelContextMenuHandler::addViewEntry(const char* iEntryName, int iEntryIndex, bool enabled)
00210 {
00211    if(!m_viewSeperator) {        
00212       m_modelPopup->AddSeparator(m_afterViewSeperator);          
00213       m_viewSeperator=dynamic_cast<TGMenuEntry*>(m_modelPopup->GetListOfEntries()->Before(m_afterViewSeperator));
00214       assert(0!=m_viewSeperator);        
00215    }
00216  
00217    if(static_cast<int>(m_nViewEntries) > iEntryIndex) {
00218       m_modelPopup->GetEntry(iEntryIndex+kViewOptionsMO)->GetLabel()->SetString(iEntryName);
00219       if(enabled)
00220          m_modelPopup->EnableEntry(iEntryIndex+kViewOptionsMO);
00221       else
00222          m_modelPopup->DisableEntry(iEntryIndex+kViewOptionsMO);
00223 
00224    } else {
00225       assert(static_cast<int>(m_nViewEntries) == iEntryIndex);
00226       m_modelPopup->AddEntry(iEntryName,kViewOptionsMO+iEntryIndex,0,0,m_viewSeperator);
00227 
00228       if (enabled)
00229          m_modelPopup->EnableEntry(kViewOptionsMO+iEntryIndex);
00230       else
00231          m_modelPopup->DisableEntry(kViewOptionsMO+iEntryIndex);
00232 
00233       ++m_nViewEntries;
00234    }
00235 
00236 }
00237 //
00238 // const member functions
00239 //
00240 void 
00241 FWModelContextMenuHandler::showSelectedModelContext(Int_t iX, Int_t iY, FWViewContextMenuHandlerBase* iHandler) const
00242 {
00243    m_viewHander=iHandler;
00244    assert(!m_selectionManager->selected().empty());
00245    createModelContext();
00246 
00247    //setup the menu based on this object
00248    FWModelId id = *(m_selectionManager->selected().begin());
00249    const FWDisplayProperties& props = id.item()->modelInfo(id.index()).displayProperties();
00250    if(props.isVisible()) {
00251       m_modelPopup->CheckEntry(kSetVisibleMO);
00252    }else {
00253       m_modelPopup->UnCheckEntry(kSetVisibleMO);
00254    }
00255 
00256 
00257    if( m_selectionManager->selected().size()==1 ) {
00258       {
00259          edm::TypeWithDict rtype(edm::TypeWithDict::byName(id.item()->modelType()->GetName()));
00260          edm::ObjectWithDict o(rtype, const_cast<void *>(id.item()->modelData(id.index())));
00261          edm::TypeMemberQuery inh =  edm::TypeMemberQuery::InheritedAlso;
00262          if ( rtype.functionMemberByName("print",edm::TypeWithDict(edm::TypeWithDict::byName("void (std::ostream&)"), Long_t(kIsConstant)), 0, inh))
00263          {
00264             m_modelPopup->EnableEntry(kPrint);
00265             // std::cout <<  "Enable " <<std::endl;
00266          }
00267          else
00268          {           
00269             m_modelPopup->DisableEntry(kPrint);
00270             // printf("Disable print \n");
00271          }         
00272       }
00273       //add the detail view entries
00274       std::vector<std::string> viewChoices = m_detailViewManager->detailViewsFor(*(m_selectionManager->selected().begin()));
00275       if(viewChoices.size()>0) {
00276          if(m_nDetailViewEntries < viewChoices.size()) {
00277             for(unsigned int index = m_nDetailViewEntries;
00278                 index != viewChoices.size();
00279                 ++index) {
00280                m_modelPopup->AddEntry(kOpenDetailView,kOpenDetailViewMO+index,0,0,m_seperator);
00281             }
00282             m_nDetailViewEntries=viewChoices.size();
00283          }
00284          const std::string kStart("Open ");
00285          const std::string kEnd(" Detail View ...");
00286          for(unsigned int index=0; index != viewChoices.size(); ++index) {
00287             m_modelPopup->GetEntry(index+kOpenDetailViewMO)->GetLabel()->SetString((kStart+viewChoices[index]+kEnd).c_str());
00288             m_modelPopup->EnableEntry(index+kOpenDetailViewMO);
00289          }
00290          for(unsigned int i =viewChoices.size(); i <m_nDetailViewEntries; ++i) {
00291             m_modelPopup->HideEntry(kOpenDetailViewMO+i);
00292          }
00293          
00294       } else {
00295          for(unsigned int i =0; i <m_nDetailViewEntries; ++i) {
00296             m_modelPopup->HideEntry(kOpenDetailViewMO+i);
00297          }
00298       }
00299    } else {
00300       for(unsigned int i =0; i <m_nDetailViewEntries; ++i) {
00301          m_modelPopup->HideEntry(kOpenDetailViewMO+i);
00302       }
00303    }
00304    //add necessary entries from the view
00305    m_modelPopup->DeleteEntry(m_viewSeperator);
00306    m_viewSeperator=0;
00307 
00308    for(unsigned int i=0; i<m_nViewEntries; ++i) {
00309       m_modelPopup->HideEntry(kViewOptionsMO+i);
00310    }
00311    if(m_viewHander) {
00312       m_viewHander->addTo(const_cast<FWModelContextMenuHandler&>(*this), *(m_selectionManager->selected().begin()));
00313    }
00314    
00315    m_x=iX;
00316    m_y=iY;
00317    m_modelPopup->PlaceMenu(iX,iY,false,true);
00318 }
00319 
00320 void 
00321 FWModelContextMenuHandler::createModelContext() const
00322 {
00323    if(0==m_modelPopup) {
00324       m_modelPopup = new FWPopupMenu();
00325       
00326       m_modelPopup->AddEntry("Set Visible",kSetVisibleMO);
00327       m_modelPopup->AddEntry("Set Color ...",kSetColorMO);
00328       m_modelPopup->AddEntry("Print ...",kPrint);
00329       m_modelPopup->AddEntry(kOpenDetailView,kOpenDetailViewMO);
00330       m_nDetailViewEntries=1;
00331       m_modelPopup->AddSeparator();
00332       m_seperator = dynamic_cast<TGMenuEntry*>(m_modelPopup->GetListOfEntries()->Last());
00333       assert(0!=m_seperator);
00334       m_modelPopup->AddEntry("Open Object Controller ...",kOpenObjectControllerMO);
00335       m_afterViewSeperator = dynamic_cast<TGMenuEntry*>(m_modelPopup->GetListOfEntries()->Last());
00336       m_modelPopup->AddEntry("Open Collection Controller ...",kOpenCollectionControllerMO);
00337 
00338       m_modelPopup->Connect("Activated(Int_t)",
00339                             "FWModelContextMenuHandler",
00340                             const_cast<FWModelContextMenuHandler*>(this),
00341                             "chosenItem(Int_t)");
00342    }
00343 }
00344 
00345 void 
00346 FWModelContextMenuHandler::createColorPopup() const
00347 {
00348    if(0==m_colorPopup) {
00349       std::vector<Color_t> colors;
00350       m_colorManager->fillLimitedColors(colors);
00351       
00352       m_colorPopup = new FWColorPopup(gClient->GetDefaultRoot(), colors.front());
00353       m_colorPopup->InitContent("", colors);
00354       m_colorPopup->Connect("ColorSelected(Color_t)","FWModelContextMenuHandler", const_cast<FWModelContextMenuHandler*>(this), "colorChangeRequested(Color_t)");
00355    }
00356 }
00357 
00358 //
00359 // static member functions
00360 //
00361 
00362 ClassImp(FWModelContextMenuHandler)