00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
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
00053
00054 static const char* const kOpenDetailView = "Open Detailed View ...";
00055
00056
00057
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
00081
00082
00083
00084
00085 FWModelContextMenuHandler::~FWModelContextMenuHandler()
00086 {
00087 delete m_modelPopup;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
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
00152
00153
00154
00155
00156
00157 const char* cmd = Form("FWGUIManager::OStream() << *(%s*)%p ;", id.item()->modelType()->GetName(), (void*)id.item()->modelData(id.index()));
00158
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
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
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
00266 }
00267 else
00268 {
00269 m_modelPopup->DisableEntry(kPrint);
00270
00271 }
00272 }
00273
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
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
00360
00361
00362 ClassImp(FWModelContextMenuHandler)