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