00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <boost/algorithm/string.hpp>
00014 #include <sstream>
00015 #include "KeySymbols.h"
00016
00017
00018 #include "Fireworks/FWInterface/src/FWPSetCellEditor.h"
00019 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00020 #include "Fireworks/Core/interface/fwLog.h"
00021
00022 #include "FWCore/Utilities/interface/Parse.h"
00023
00024
00025
00026 template <class T>
00027 bool editNumericParameter(edm::ParameterSet &ps, bool tracked,
00028 const std::string &label,
00029 const std::string &value)
00030 {
00031 std::stringstream str(value);
00032 T v;
00033 str >> v;
00034 bool fail = str.fail();
00035 if (tracked)
00036 ps.addParameter(label, v);
00037 else
00038 ps.addUntrackedParameter(label, v);
00039
00040 return fail;
00041 }
00042
00043
00044 void editStringParameter(edm::ParameterSet &ps, bool tracked,
00045 const std::string &label,
00046 const std::string &value)
00047 {
00048 if (tracked)
00049 ps.addParameter(label, value);
00050 else
00051 ps.addUntrackedParameter(label, value);
00052 }
00053
00054
00055
00056 void editBoolParameter(edm::ParameterSet &ps, bool tracked,
00057 const std::string &label,
00058 const std::string &value)
00059 {
00060 bool x = false;
00061
00062 if (boost::iequals(value, "true")) {
00063 x = true;
00064 }
00065 else if (boost::iequals(value, "false")){
00066 x = false;
00067 }
00068 else {
00069 fwLog(fwlog::kError) << "Invalid value. Possible values are true/false case insensitive." << std::endl;
00070 return;
00071 }
00072 if (tracked)
00073 ps.addParameter<bool>(label, x);
00074 else
00075 ps.addUntrackedParameter<bool>(label, x);
00076 }
00077
00078
00079 void editFileInPath(edm::ParameterSet &ps, bool tracked,
00080 const std::string &label,
00081 const std::string &value)
00082 {
00083 if (tracked)
00084 ps.addParameter(label, edm::FileInPath(value));
00085 else
00086 ps.addUntrackedParameter(label, edm::FileInPath(value));
00087 }
00088
00089
00090
00091 bool editVInputTag(edm::ParameterSet &ps, bool tracked,
00092 const std::string &label,
00093 const std::string &value)
00094 {
00095 std::vector<edm::InputTag> inputTags;
00096 std::stringstream iss(value);
00097 std::string vitem;
00098 bool fail = false;
00099 size_t fst, lst;
00100
00101 while (getline(iss, vitem, ','))
00102 {
00103 fst = vitem.find("[");
00104 lst = vitem.find("]");
00105
00106 if ( fst != std::string::npos )
00107 vitem.erase(fst,1);
00108 if ( lst != std::string::npos )
00109 vitem.erase(lst,1);
00110
00111 std::vector<std::string> tokens = edm::tokenize(vitem, ":");
00112 size_t nwords = tokens.size();
00113
00114 if ( nwords > 3 )
00115 {
00116 fail = true;
00117 return fail;
00118 }
00119 else
00120 {
00121 std::string it_label("");
00122 std::string it_instance("");
00123 std::string it_process("");
00124
00125 if ( nwords > 0 )
00126 it_label = tokens[0];
00127 if ( nwords > 1 )
00128 it_instance = tokens[1];
00129 if ( nwords > 2 )
00130 it_process = tokens[2];
00131
00132 inputTags.push_back(edm::InputTag(it_label, it_instance, it_process));
00133 }
00134 }
00135
00136 if (tracked)
00137 ps.addParameter(label, inputTags);
00138 else
00139 ps.addUntrackedParameter(label, inputTags);
00140
00141 return fail;
00142 }
00143
00144
00145
00146 bool editInputTag(edm::ParameterSet &ps, bool tracked,
00147 const std::string &label,
00148 const std::string &value)
00149 {
00150 std::vector<std::string> tokens = edm::tokenize(value, ":");
00151 size_t nwords = tokens.size();
00152
00153 bool fail;
00154
00155 if ( nwords > 3 )
00156 {
00157 fail = true;
00158 }
00159 else
00160 {
00161 std::string it_label("");
00162 std::string it_instance("");
00163 std::string it_process("");
00164
00165 if ( nwords > 0 )
00166 it_label = tokens[0];
00167 if ( nwords > 1 )
00168 it_instance = tokens[1];
00169 if ( nwords > 2 )
00170 it_process = tokens[2];
00171
00172 if ( tracked )
00173 ps.addParameter(label, edm::InputTag(it_label, it_instance, it_process));
00174 else
00175 ps.addUntrackedParameter(label, edm::InputTag(it_label, it_instance, it_process));
00176
00177 fail = false;
00178 }
00179
00180 return fail;
00181 }
00182
00183
00184
00185 bool editESInputTag(edm::ParameterSet &ps, bool tracked,
00186 const std::string &label,
00187 const std::string &value)
00188 {
00189 std::vector<std::string> tokens = edm::tokenize(value, ":");
00190 size_t nwords = tokens.size();
00191
00192 bool fail;
00193
00194 if ( nwords > 2 )
00195 {
00196 fail = true;
00197 }
00198 else
00199 {
00200 std::string it_module("");
00201 std::string it_data("");
00202
00203 if ( nwords > 0 )
00204 it_module = tokens[0];
00205 if ( nwords > 1 )
00206 it_data = tokens[1];
00207
00208 if ( tracked )
00209 ps.addParameter(label, edm::ESInputTag(it_module, it_data));
00210 else
00211 ps.addUntrackedParameter(label, edm::ESInputTag(it_module, it_data));
00212
00213 fail = false;
00214 }
00215
00216 return fail;
00217 }
00218
00219
00220 template <typename T>
00221 void editVectorParameter(edm::ParameterSet &ps, bool tracked,
00222 const std::string &label,
00223 const std::string &value)
00224 {
00225 std::vector<T> valueVector;
00226
00227 std::stringstream iss(value);
00228 std::string vitem;
00229
00230 size_t fst, lst;
00231
00232 while (getline(iss, vitem, ','))
00233 {
00234 fst = vitem.find("[");
00235 lst = vitem.find("]");
00236
00237 if ( fst != std::string::npos )
00238 vitem.erase(fst,1);
00239 if ( lst != std::string::npos )
00240 vitem.erase(lst,1);
00241
00242 std::stringstream oss(vitem);
00243 T on;
00244 oss >> on;
00245
00246 valueVector.push_back(on);
00247 }
00248
00249 if (tracked)
00250 ps.addParameter(label, valueVector);
00251 else
00252 ps.addUntrackedParameter(label, valueVector);
00253 }
00254
00255
00256
00257 bool FWPSetCellEditor::apply(FWPSetTableManager::PSetData &data, FWPSetTableManager::PSetData &parent)
00258 {
00259 switch (data.type)
00260 {
00261 case 'I':
00262 editNumericParameter<int32_t>(*parent.pset, data.tracked, data.label, GetText());
00263 break;
00264 case 'B':
00265 editBoolParameter(*parent.pset, data.tracked, data.label, GetText());
00266 break;
00267 case 'U':
00268 editNumericParameter<uint32_t>(*parent.pset, data.tracked, data.label, GetText());
00269 break;
00270 case 'D':
00271 editNumericParameter<double>(*parent.pset, data.tracked, data.label, GetText());
00272 break;
00273 case 'L':
00274 editNumericParameter<long long>(*parent.pset, data.tracked, data.label, GetText());
00275 break;
00276 case 'X':
00277 editNumericParameter<unsigned long long>(*parent.pset, data.tracked, data.label, GetText());
00278 break;
00279 case 'S':
00280 editStringParameter(*parent.pset, data.tracked, data.label, GetText());
00281 break;
00282 case 'i':
00283 editVectorParameter<int32_t>(*parent.pset, data.tracked, data.label, GetText());
00284 break;
00285 case 'u':
00286 editVectorParameter<uint32_t>(*parent.pset, data.tracked, data.label, GetText());
00287 break;
00288 case 'l':
00289 editVectorParameter<long long>(*parent.pset, data.tracked, data.label, GetText());
00290 break;
00291 case 'x':
00292 editVectorParameter<unsigned long long>(*parent.pset, data.tracked, data.label, GetText());
00293 break;
00294 case 'd':
00295 editVectorParameter<double>(*parent.pset, data.tracked, data.label, GetText());
00296 break;
00297 case 's':
00298 editVectorParameter<std::string>(*parent.pset, data.tracked, data.label, GetText());
00299 break;
00300 case 't':
00301 editInputTag(*parent.pset, data.tracked, data.label, GetText());
00302 break;
00303 case 'g':
00304 editESInputTag(*parent.pset, data.tracked, data.label, GetText());
00305 break;
00306 case 'v':
00307 editVInputTag(*parent.pset, data.tracked, data.label, GetText());
00308 break;
00309 case 'F':
00310 editFileInPath(*parent.pset, data.tracked, data.label, GetText());
00311 break;
00312 default:
00313 fwLog(fwlog::kError) << "unsupported parameter" << std::endl;
00314 UnmapWindow();
00315 return false;
00316 }
00317 return true;
00318 }
00319
00320
00321
00322 bool FWPSetCellEditor::HandleKey(Event_t*event)
00323 {
00324 UInt_t keysym = event->fCode;
00325
00326 if (keysym == (UInt_t) gVirtualX->KeysymToKeycode(kKey_Escape))
00327 {
00328 TGFrame *p = dynamic_cast<TGFrame*>(const_cast<TGWindow*>(GetParent()));
00329 while (p)
00330 {
00331 TGMainFrame *mp = dynamic_cast<TGMainFrame*>(p);
00332
00333 if (mp)
00334 {
00335 return mp->HandleKey(event);
00336 }
00337 p = dynamic_cast<TGFrame*>(const_cast<TGWindow*>(p->GetParent()));
00338 }
00339 }
00340
00341 return TGTextEntry::HandleKey(event);
00342 }