File indexing completed on 2024-04-06 12:11:42
0001 #include <iostream>
0002 #include <fstream>
0003 #include "Fireworks/Core/interface/FWPartialConfig.h"
0004 #include "TGButton.h"
0005 #include "TEveManager.h"
0006 #include "TGString.h"
0007 #include "TGLabel.h"
0008 #include "TSystem.h"
0009 #include "TROOT.h"
0010
0011 #include "Fireworks/Core/interface/SimpleSAXParser.h"
0012 #include "Fireworks/Core/interface/FWXMLConfigParser.h"
0013 #include "Fireworks/Core/interface/FWEventItemsManager.h"
0014 #include "Fireworks/Core/interface/FWGUIManager.h"
0015 #include "Fireworks/Core/interface/CmsShowMainFrame.h"
0016 #include "Fireworks/Core/interface/FWConfigurationManager.h"
0017 #include "Fireworks/Core/interface/fwLog.h"
0018
0019 namespace {
0020 struct MyNameMap {
0021 std::vector<std::pair<std::string, std::string> > names = {{"GUI", "Windows"},
0022 {"CommonPreferences", "Colors"},
0023 {"EventNavigator", "EventFilters"},
0024 {"EventItems", "Collections"}};
0025
0026 std::string realName(std::string btnName) {
0027 for (std::vector<std::pair<std::string, std::string> >::iterator i = names.begin(); i != names.end(); ++i) {
0028 if (i->second == btnName)
0029 return i->first;
0030 }
0031 return btnName;
0032 }
0033
0034 std::string btnName(const std::string& rlName) {
0035 for (std::vector<std::pair<std::string, std::string> >::iterator i = names.begin(); i != names.end(); ++i) {
0036 if (i->first == rlName)
0037 return i->second;
0038 }
0039 return rlName;
0040 }
0041 };
0042
0043 MyNameMap nmm;
0044 }
0045
0046 FWPartialConfigGUI::FWPartialConfigGUI(const char* path, FWConfigurationManager* iCfg)
0047 : TGTransientFrame(gClient->GetRoot(), FWGUIManager::getGUIManager()->getMainFrame(), 200, 140), m_cfgMng(iCfg) {
0048 if (path) {
0049 std::ifstream g(path);
0050 FWXMLConfigParser parser(g);
0051 parser.parse();
0052 parser.config()->swap(m_origConfig);
0053 } else {
0054 FWConfiguration curr;
0055 m_cfgMng->to(curr);
0056 curr.swap(m_origConfig);
0057 }
0058
0059 TGVerticalFrame* vf = new TGVerticalFrame(this);
0060 AddFrame(vf, new TGLayoutHints(kLHintsNormal, 2, 2, 4, 4));
0061
0062
0063 FWConfiguration::KeyValues* kv = (FWConfiguration::KeyValues*)m_origConfig.keyValues();
0064 std::sort(kv->begin(),
0065 kv->end(),
0066 [](const std::pair<std::string, FWConfiguration>& lhs, const std::pair<std::string, FWConfiguration>& rhs)
0067 -> bool { return nmm.btnName(lhs.first) < nmm.btnName(rhs.first); });
0068
0069 for (FWConfiguration::KeyValues::const_iterator it = m_origConfig.keyValues()->begin();
0070 it != m_origConfig.keyValues()->end();
0071 ++it) {
0072 if (it->second.keyValues()) {
0073 std::string nb = nmm.btnName(it->first);
0074 TGCheckButton* cb = new TGCheckButton(vf, nb.c_str());
0075 vf->AddFrame(cb);
0076
0077 m_entries.push_back(cb);
0078 }
0079 }
0080 }
0081
0082 void FWPartialConfigGUI::Cancel() {
0083
0084 UnmapWindow();
0085 }
0086
0087
0088
0089
0090
0091
0092 FWPartialConfigLoadGUI::FWPartialConfigLoadGUI(const char* path,
0093 FWConfigurationManager* iCfg,
0094 FWEventItemsManager* iEiMng)
0095 : FWPartialConfigGUI(path, iCfg), m_eiMng(iEiMng) {
0096 TGHorizontalFrame* hf = new TGHorizontalFrame(this);
0097 AddFrame(hf, new TGLayoutHints(kLHintsRight | kLHintsBottom, 1, 1, 2, 4));
0098 TGTextButton* load = new TGTextButton(hf, " Load ");
0099 load->Connect("Clicked()", "FWPartialConfigLoadGUI", this, "Load()");
0100 hf->AddFrame(load, new TGLayoutHints(kLHintsExpandX, 2, 2, 0, 0));
0101 TGTextButton* cancel = new TGTextButton(hf, " Cancel ");
0102 cancel->Connect("Clicked()", "FWPartialConfigGUI", this, "Cancel()");
0103 hf->AddFrame(cancel, new TGLayoutHints(kLHintsExpandX, 2, 2, 0, 0));
0104
0105 SetWindowName("Load Config");
0106 MapSubwindows();
0107 Layout();
0108 MapWindow();
0109 }
0110
0111 FWPartialConfigLoadGUI::~FWPartialConfigLoadGUI() {}
0112
0113 void FWPartialConfigLoadGUI::Load() {
0114 bool resetViews = true;
0115 bool resetEI = true;
0116
0117 FWConfiguration::KeyValues* kv = (FWConfiguration::KeyValues*)m_origConfig.keyValues();
0118
0119 for (auto i = m_entries.begin(); i != m_entries.end(); i++) {
0120 if (!((*i)->IsOn())) {
0121 std::string key = nmm.realName((*i)->GetText()->GetString());
0122 if (key == "EventItems")
0123 resetEI = false;
0124 if (key == "GUI")
0125 resetViews = false;
0126
0127 for (FWConfiguration::KeyValues::iterator it = kv->begin(); it != kv->end(); ++it) {
0128 if (key == it->first) {
0129 kv->erase(it);
0130 break;
0131 }
0132 }
0133 }
0134 }
0135
0136 if (resetEI)
0137 m_eiMng->clearItems();
0138
0139 if (resetViews)
0140 FWGUIManager::getGUIManager()->subviewDestroyAll();
0141
0142 gEve->DisableRedraw();
0143 m_cfgMng->setFrom(m_origConfig);
0144 gEve->EnableRedraw();
0145
0146 UnmapWindow();
0147 }
0148
0149
0150
0151
0152
0153
0154 FWPartialConfigSaveGUI::FWPartialConfigSaveGUI(const char* path_out, const char* path_in, FWConfigurationManager* iCfg)
0155 : FWPartialConfigGUI(nullptr, iCfg), m_outFileName(path_out), m_currFileName(path_in) {
0156 TGHorizontalFrame* hf = new TGHorizontalFrame(this);
0157 AddFrame(hf, new TGLayoutHints(kLHintsRight | kLHintsBottom, 1, 1, 2, 4));
0158
0159 TGTextButton* write = new TGTextButton(hf, " Write ");
0160 write->Connect("Clicked()", "FWPartialConfigSaveGUI", this, "WriteConfig()");
0161 hf->AddFrame(write, new TGLayoutHints(kLHintsExpandX, 2, 2, 0, 0));
0162
0163 TGTextButton* cancel = new TGTextButton(hf, " Cancel ");
0164 cancel->Connect("Clicked()", "FWPartialConfigGUI", this, "Cancel()");
0165 hf->AddFrame(cancel, new TGLayoutHints(kLHintsExpandX, 2, 2, 0, 0));
0166
0167 AddFrame(new TGLabel(this, Form("Output file: %s", gSystem->BaseName(path_out))),
0168 new TGLayoutHints(kLHintsLeft, 8, 2, 3, 3));
0169
0170 SetWindowName("Save Config");
0171
0172 MapSubwindows();
0173 Layout();
0174 MapWindow();
0175 }
0176
0177 void FWPartialConfigSaveGUI::WriteConfig() {
0178 FWConfiguration destination;
0179 {
0180 m_currFileName = gSystem->Which(TROOT::GetMacroPath(), m_currFileName.c_str(), kReadPermission);
0181
0182 std::ifstream g(m_currFileName.c_str());
0183 if (g.peek() == (int)'<') {
0184 FWXMLConfigParser parser(g);
0185 parser.parse();
0186 parser.config()->swap(destination);
0187
0188 }
0189 }
0190
0191 FWConfiguration curr;
0192 m_cfgMng->to(curr);
0193
0194 FWConfiguration::KeyValues* cur_kv = (FWConfiguration::KeyValues*)m_origConfig.keyValues();
0195 FWConfiguration::KeyValues* old_kv = (FWConfiguration::KeyValues*)destination.keyValues();
0196
0197 for (auto i = m_entries.begin(); i != m_entries.end(); i++) {
0198 if ((*i)->IsOn()) {
0199 std::string key = nmm.realName((*i)->GetText()->GetString());
0200
0201 for (FWConfiguration::KeyValues::iterator it = cur_kv->begin(); it != cur_kv->end(); ++it) {
0202 if (key == it->first) {
0203 bool replace = false;
0204 if (old_kv) {
0205 for (FWConfiguration::KeyValues::iterator oldit = old_kv->begin(); oldit != old_kv->end(); ++oldit) {
0206 if (key == oldit->first) {
0207 replace = true;
0208 oldit->second.swap(it->second);
0209 break;
0210 }
0211 }
0212 }
0213
0214 if (!replace)
0215 destination.addKeyValue(it->first, it->second);
0216
0217 break;
0218 }
0219 }
0220 }
0221 }
0222
0223
0224 std::ofstream file(m_outFileName.c_str());
0225 if (not file) {
0226 fwLog(fwlog::kError) << "FWPartialConfigSaveGUI::Write, can't open output file.!\n";
0227 return;
0228 }
0229 fwLog(fwlog::kInfo) << "Writing configuration to " << m_outFileName << std::endl;
0230 FWConfiguration::streamTo(file, destination, "top");
0231 UnmapWindow();
0232 }