00001 #include <QtGui>
00002 #include <QMenu>
00003 #include <QMessageBox>
00004 #include <QProgressDialog>
00005
00006 #include "cetlib/filepath_maker.h"
00007 #include "fhiclcpp/make_ParameterSet.h"
00008 #include "fhiclcpp/ParameterSet.h"
00009
00010 #include "mfextensions/Binaries/mvdlg.hh"
00011 #include "trace.h"
00012 #include "mvdlg.hh"
00013
00014
00015
00016 static void
00017 process_fname(std::string& fname)
00018 {
00019 size_t sub_start = fname.find("${");
00020 size_t sub_end = fname.find("}");
00021
00022 const size_t npos = std::string::npos;
00023
00024 if ((sub_start == npos && sub_end != npos)
00025 || (sub_start != npos && sub_end == npos)
00026 || (sub_start > sub_end))
00027 {
00028 throw std::runtime_error("Unrecognized configuration file. Use default configuration instead.");
00029 }
00030
00031 if (sub_start == npos) return;
00032
00033 std::string env = std::string(getenv(fname.substr(sub_start + 2, sub_end - sub_start - 2).c_str()));
00034 fname.replace(sub_start, sub_end - sub_start + 1, env);
00035
00036
00037 }
00038
00039 static fhicl::ParameterSet
00040 readConf(std::string const& fname)
00041 {
00042 if (fname.empty()) return fhicl::ParameterSet();
00043
00044 std::string filename = fname;
00045 process_fname(filename);
00046
00047 std::string env("FHICL_FILE_PATH=");
00048
00049 if (filename[0] == '/')
00050 {
00051 env.append("/");
00052 }
00053 else
00054 {
00055 env.append(".");
00056 }
00057
00058 char* mfe_path = getenv("MFEXTENSIONS_DIR");
00059 if (mfe_path) env.append(":").append(mfe_path).append("/config");
00060
00061 putenv((char *)env.c_str());
00062
00063
00064
00065 cet::filepath_lookup policy("FHICL_FILE_PATH");
00066
00067
00068 fhicl::ParameterSet pset;
00069 fhicl::make_ParameterSet(filename, policy, pset);
00070
00071 return pset;
00072 }
00073
00074 msgViewerDlg::msgViewerDlg(std::string const& conf, QDialog* parent)
00075 : QDialog(parent)
00076 , updating(false)
00077 , paused(false)
00078 , shortMode_(false)
00079 , nMsgs(0)
00080 , nSupMsgs(0)
00081 , nThrMsgs(0)
00082 , nFilters(0)
00083 , simpleRender(true)
00084 , sevThresh(SINFO)
00085 , searchStr("")
00086 , msg_pool_()
00087 , host_msgs_()
00088 , cat_msgs_()
00089 , app_msgs_()
00090 , sup_menu(new QMenu(this))
00091 , thr_menu(new QMenu(this))
00092 , receivers_(readConf(conf).get<fhicl::ParameterSet>("receivers", fhicl::ParameterSet()))
00093 {
00094 setupUi(this);
00095
00096
00097 readSettings();
00098
00099
00100 fhicl::ParameterSet pset = readConf(conf);
00101
00102
00103 parseConf(pset);
00104
00105
00106 btnSuppression->setMenu(sup_menu);
00107 btnThrottling->setMenu(thr_menu);
00108
00109
00110 connect(btnPause, SIGNAL(clicked()), this, SLOT(pause()));
00111 connect(btnExit, SIGNAL(clicked()), this, SLOT(exit()));
00112 connect(btnClear, SIGNAL(clicked()), this, SLOT(clear()));
00113
00114 connect(btnRMode, SIGNAL(clicked()), this, SLOT(renderMode()));
00115 connect(btnDisplayMode, SIGNAL(clicked()), this, SLOT(shortMode()));
00116
00117 connect(btnSearch, SIGNAL(clicked()), this, SLOT(searchMsg()));
00118 connect(btnSearchClear,
00119 SIGNAL(clicked()), this, SLOT(searchClear()));
00120
00121 connect(btnFilter, SIGNAL(clicked()), this, SLOT(setFilter()));
00122
00123 connect(btnError, SIGNAL(clicked()), this, SLOT(setSevError()));
00124 connect(btnWarning, SIGNAL(clicked()), this, SLOT(setSevWarning()));
00125 connect(btnInfo, SIGNAL(clicked()), this, SLOT(setSevInfo()));
00126 connect(btnDebug, SIGNAL(clicked()), this, SLOT(setSevDebug()));
00127
00128 connect(sup_menu
00129 , SIGNAL(triggered(QAction*))
00130 , this
00131 , SLOT(setSuppression(QAction*)));
00132
00133 connect(thr_menu
00134 , SIGNAL(triggered(QAction*))
00135 , this
00136 , SLOT(setThrottling(QAction*)));
00137
00138 connect(vsSeverity
00139 , SIGNAL(valueChanged(int))
00140 , this
00141 , SLOT(changeSeverity(int)));
00142
00143 connect(&receivers_
00144 , SIGNAL(newMessage(mf::MessageFacilityMsg const &))
00145 , this
00146 , SLOT(onNewMsg(mf::MessageFacilityMsg const &)));
00147
00148 connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabWidgetCurrentChanged(int)));
00149 connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(tabCloseRequested(int)));
00150 MsgFilterDisplay allMessages;
00151 allMessages.txtDisplay = txtMessages;
00152 msgFilters_.push_back(allMessages);
00153
00154
00155 QTabBar *tabBar = tabWidget->findChild<QTabBar *>();
00156 tabBar->setTabButton(0, QTabBar::RightSide, 0);
00157 tabBar->setTabButton(0, QTabBar::LeftSide, 0);
00158
00159 if (simpleRender) btnRMode->setChecked(true);
00160 else btnRMode->setChecked(false);
00161
00162 btnRMode->setEnabled(false);
00163
00164 changeSeverity(sevThresh);
00165
00166 QTextDocument* doc = new QTextDocument(txtMessages);
00167 txtMessages->setDocument(doc);
00168
00169 receivers_.start();
00170 }
00171
00172 msgViewerDlg::~msgViewerDlg()
00173 {
00174 receivers_.stop();
00175 writeSettings();
00176 }
00177
00178 static void str_to_suppress(std::vector<std::string> const& vs, std::vector<suppress>& s, QMenu* menu)
00179 {
00180 QAction* act;
00181
00182 if (vs.empty())
00183 {
00184 act = menu->addAction("None");
00185 act->setEnabled(false);
00186 return;
00187 }
00188
00189 s.reserve(vs.size());
00190
00191 for (size_t i = 0; i < vs.size(); ++i)
00192 {
00193 s.push_back(suppress(vs[i]));
00194 act = menu->addAction(QString(vs[i].c_str()));
00195 act->setCheckable(true);
00196 act->setChecked(true);
00197 QVariant v = qVariantFromValue((void*)&s[i]);
00198 act->setData(v);
00199 }
00200 }
00201
00202 static void pset_to_throttle(std::vector<fhicl::ParameterSet> const& ps, std::vector<throttle>& t, QMenu* menu)
00203 {
00204 QAction* act;
00205
00206 if (ps.empty())
00207 {
00208 act = menu->addAction("None");
00209 act->setEnabled(false);
00210 return;
00211 }
00212
00213 t.reserve(ps.size());
00214
00215 for (size_t i = 0; i < ps.size(); ++i)
00216 {
00217 std::string name = ps[i].get<std::string>("name");
00218 t.push_back(throttle(name
00219 , ps[i].get<int>("limit", -1)
00220 , ps[i].get<long>("timespan", -1)));
00221 act = menu->addAction(QString(name.c_str()));
00222 act->setCheckable(true);
00223 act->setChecked(true);
00224 QVariant v = qVariantFromValue((void*)&t[i]);
00225 act->setData(v);
00226 }
00227 }
00228
00229 void msgViewerDlg::parseConf(fhicl::ParameterSet const& conf)
00230 {
00231 fhicl::ParameterSet nulp;
00232
00233
00234
00235 fhicl::ParameterSet sup = conf.get<fhicl::ParameterSet>("suppress", nulp);
00236
00237 auto sup_host = sup.get<std::vector<std::string>>("hosts", std::vector<std::string>());
00238 auto sup_app = sup.get<std::vector<std::string>>("applications", std::vector<std::string>());
00239 auto sup_cat = sup.get<std::vector<std::string>>("categories", std::vector<std::string>());
00240
00241 str_to_suppress(sup_host, e_sup_host, sup_menu);
00242 sup_menu->addSeparator();
00243
00244 str_to_suppress(sup_app, e_sup_app, sup_menu);
00245 sup_menu->addSeparator();
00246
00247 str_to_suppress(sup_cat, e_sup_cat, sup_menu);
00248
00249
00250 auto thr = conf.get<fhicl::ParameterSet>("throttle", nulp);
00251
00252 auto thr_host = thr.get<std::vector<fhicl::ParameterSet>>("hosts", std::vector<fhicl::ParameterSet>());
00253 auto thr_app = thr.get<std::vector<fhicl::ParameterSet>>("applications", std::vector<fhicl::ParameterSet>());
00254 auto thr_cat = thr.get<std::vector<fhicl::ParameterSet>>("categories", std::vector<fhicl::ParameterSet>());
00255
00256 pset_to_throttle(thr_host, e_thr_host, thr_menu);
00257 thr_menu->addSeparator();
00258
00259 pset_to_throttle(thr_app, e_thr_app, thr_menu);
00260 thr_menu->addSeparator();
00261
00262 pset_to_throttle(thr_cat, e_thr_cat, thr_menu);
00263
00264 auto lvl = conf.get<std::string>("threshold", "INFO");
00265 if (lvl == "DEBUG" || lvl == "debug" || lvl == "0") { sevThresh = SDEBUG; }
00266 if (lvl == "INFO" || lvl == "info" || lvl == "1") { sevThresh = SINFO; }
00267 if (lvl == "WARN" || lvl == "warn" || lvl == "2") { sevThresh = SWARNING; }
00268 if (lvl == "ERROR" || lvl == "error" || lvl == "3") { sevThresh = SERROR; }
00269 }
00270
00271 bool msgViewerDlg::msg_throttled(mf::MessageFacilityMsg const& mfmsg)
00272 {
00273
00274
00275 ++nSupMsgs;
00276
00277 for (size_t i = 0; i < e_sup_host.size(); ++i)
00278 if (e_sup_host[i].match(mfmsg.hostname()))
00279 return true;
00280
00281 for (size_t i = 0; i < e_sup_app.size(); ++i)
00282 if (e_sup_app[i].match(mfmsg.application()))
00283 return true;
00284
00285 for (size_t i = 0; i < e_sup_cat.size(); ++i)
00286 if (e_sup_cat[i].match(mfmsg.category()))
00287 return true;
00288
00289 --nSupMsgs;
00290
00291
00292
00293 ++nThrMsgs;
00294
00295 for (size_t i = 0; i < e_thr_host.size(); ++i)
00296 if (e_thr_host[i].reach_limit(mfmsg.hostname(), mfmsg.timestamp()))
00297 return true;
00298
00299 for (size_t i = 0; i < e_thr_app.size(); ++i)
00300 if (e_thr_app[i].reach_limit(mfmsg.application(), mfmsg.timestamp()))
00301 return true;
00302
00303 for (size_t i = 0; i < e_thr_cat.size(); ++i)
00304 if (e_thr_cat[i].reach_limit(mfmsg.category(), mfmsg.timestamp()))
00305 return true;
00306
00307 --nThrMsgs;
00308
00309 return false;
00310 }
00311
00312 void msgViewerDlg::writeSettings()
00313 {
00314 QSettings settings("ARTDAQ", "MsgViewer");
00315
00316 settings.beginGroup("MainWindow");
00317 settings.setValue("size", size());
00318 settings.setValue("pos", pos());
00319 settings.endGroup();
00320 }
00321
00322 void msgViewerDlg::readSettings()
00323 {
00324 QSettings settings("ARTDAQ", "MsgViewer");
00325
00326 settings.beginGroup("MainWindow");
00327 QPoint pos = settings.value("pos", QPoint(100, 100)).toPoint();
00328 QSize size = settings.value("size", QSize(660, 760)).toSize();
00329 resize(size);
00330 move(pos);
00331 settings.endGroup();
00332 }
00333
00334 void msgViewerDlg::onNewMsg(mf::MessageFacilityMsg const& mfmsg)
00335 {
00336
00337
00338
00339
00340 ++nMsgs;
00341 lcdMsgs->display(nMsgs);
00342
00343
00344 if (msg_throttled(mfmsg))
00345 {
00346 lcdSuppressionCount->display(nSupMsgs);
00347 lcdThrottlingCount->display(nThrMsgs);
00348 return;
00349 }
00350
00351
00352 msg_pool_.emplace_back(mfmsg);
00353 msgs_t::iterator it = --msg_pool_.end();
00354
00355
00356 unsigned int flag = update_index(it);
00357
00358
00359 if (flag & LIST_APP) updateList<msg_iters_map_t>(lwApplication, app_msgs_);
00360 if (flag & LIST_CAT) updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
00361 if (flag & LIST_HOST) updateList<msg_iters_map_t>(lwHost, host_msgs_);
00362
00363 for (size_t d = 0; d < msgFilters_.size(); ++d)
00364 {
00365 bool hostMatch = msgFilters_[d].hostFilter.contains(it->host(), Qt::CaseInsensitive) || msgFilters_[d].hostFilter.size() == 0;
00366 bool appMatch = msgFilters_[d].appFilter.contains(it->app(), Qt::CaseInsensitive) || msgFilters_[d].appFilter.size() == 0;
00367 bool catMatch = msgFilters_[d].catFilter.contains(it->cat(), Qt::CaseInsensitive) || msgFilters_[d].catFilter.size() == 0;
00368
00369
00370 if (hostMatch && appMatch && catMatch)
00371 {
00372 msgFilters_[d].msgs.push_back(it);
00373 displayMsg(it, d);
00374 }
00375 }
00376 }
00377
00378 unsigned int msgViewerDlg::update_index(msgs_t::iterator it)
00379 {
00380 QString const& app = it->app();
00381 QString const& cat = it->cat();
00382 QString const& host = it->host();
00383
00384 unsigned int update = 0x0;
00385
00386 if (cat_msgs_.find(cat) == cat_msgs_.end()) update |= LIST_CAT;
00387 if (host_msgs_.find(host) == host_msgs_.end()) update |= LIST_HOST;
00388 if (app_msgs_.find(app) == app_msgs_.end()) update |= LIST_APP;
00389
00390 cat_msgs_[cat].push_back(it);
00391 host_msgs_[host].push_back(it);
00392 app_msgs_[app].push_back(it);
00393
00394 return update;
00395 }
00396
00397
00398 void msgViewerDlg::displayMsg(msgs_t::const_iterator it, int display)
00399 {
00400 if (it->sev() < sevThresh) return;
00401
00402 msgFilters_[display].nDisplayMsgs++;
00403 if (display == tabWidget->currentIndex())
00404 {
00405 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
00406 }
00407
00408 auto txt = it->text(shortMode_);
00409 msgFilters_[display].txtDisplay->append(txt);
00410 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
00411 }
00412
00413 void msgViewerDlg::displayMsg(int display)
00414 {
00415 int n = 0;
00416 msgFilters_[display].txtDisplay->clear();
00417 msgFilters_[display].nDisplayMsgs = 0;
00418
00419 msg_iters_t::const_iterator it;
00420
00421 n = msgFilters_[display].msgs.size();
00422 it = msgFilters_[display].msgs.begin();
00423 QProgressDialog progress("Fetching data...", "Cancel"
00424 , 0, n / 1000, this);
00425
00426 progress.setWindowModality(Qt::WindowModal);
00427 progress.setMinimumDuration(2000);
00428
00429 QString txt;
00430 int i = 0, prog = 0;
00431
00432 updating = true;
00433
00434 for (; it != msgFilters_[display].msgs.end(); ++it, ++i)
00435 {
00436 if (it->get()->sev() >= sevThresh)
00437 {
00438 txt += it->get()->text(shortMode_);
00439 ++msgFilters_[display].nDisplayMsgs;
00440 }
00441
00442 if (i == 1000)
00443 {
00444 i = 0;
00445 ++prog;
00446 progress.setValue(prog);
00447
00448 msgFilters_[display].txtDisplay->append(txt);
00449 txt.clear();
00450 }
00451
00452 if (progress.wasCanceled())
00453 break;
00454 }
00455
00456 if (display == tabWidget->currentIndex())
00457 {
00458 lcdDisplayedMsgs->display(msgFilters_[display].nDisplayMsgs);
00459 }
00460
00461 msgFilters_[display].txtDisplay->append(txt);
00462 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
00463
00464 updating = false;
00465 }
00466
00467 void msgViewerDlg::updateDisplays()
00468 {
00469 for (size_t ii = 0; ii < msgFilters_.size(); ++ii)
00470 {
00471 displayMsg(ii);
00472 }
00473 }
00474
00475 template <typename M>
00476 bool msgViewerDlg::updateList(QListWidget* lw, M const& map)
00477 {
00478 bool nonSelectedBefore = (lw->currentRow() == -1);
00479 bool nonSelectedAfter = true;
00480
00481 QString item = nonSelectedBefore ? "" : lw->currentItem()->text();
00482
00483 lw->clear();
00484 int row = 0;
00485 typename M::const_iterator it = map.begin();
00486
00487 while (it != map.end())
00488 {
00489 lw->addItem(it->first);
00490 if (!nonSelectedBefore && nonSelectedAfter)
00491 {
00492 if (item == it->first)
00493 {
00494 lw->setCurrentRow(row);
00495 nonSelectedAfter = false;
00496 }
00497 }
00498 ++row;
00499 ++it;
00500 }
00501
00502 if (!nonSelectedBefore && nonSelectedAfter) return true;
00503
00504 return false;
00505 }
00506
00507 msg_iters_t msgViewerDlg::list_intersect(msg_iters_t const& l1, msg_iters_t const& l2)
00508 {
00509 msg_iters_t output;
00510 msg_iters_t::const_iterator it1 = l1.begin();
00511 msg_iters_t::const_iterator it2 = l2.begin();
00512
00513 while (it1 != l1.end() && it2 != l2.end())
00514 {
00515 if (*it1 < *it2) { ++it1; }
00516 else if (*it2 < *it1) { ++it2; }
00517 else
00518 {
00519 output.push_back(*it1);
00520 ++it1;
00521 ++it2;
00522 }
00523 }
00524
00525 TRACE(10, "list_intersect: output list has %zu entries", output.size());
00526 return output;
00527 }
00528
00529 std::string sev_to_string(sev_code_t s)
00530 {
00531 switch (s)
00532 {
00533 case SDEBUG:
00534 return "DEBUG";
00535 case SINFO:
00536 return "INFO";
00537 case SWARNING:
00538 return "WARNING";
00539 case SERROR:
00540 return "ERROR";
00541 }
00542 return "UNKNOWN";
00543 }
00544
00545 void msgViewerDlg::setFilter()
00546 {
00547 auto hostFilter = toQStringList(lwHost->selectedItems());
00548 auto appFilter = toQStringList(lwApplication->selectedItems());
00549 auto catFilter = toQStringList(lwCategory->selectedItems());
00550
00551 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
00552 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
00553 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
00554
00555 if (hostFilter.isEmpty()
00556 && appFilter.isEmpty()
00557 && catFilter.isEmpty())
00558 {
00559 return;
00560 }
00561
00562 msg_iters_t result;
00563 QString catFilterExpression = "";
00564 QString hostFilterExpression = "";
00565 QString appFilterExpression = "";
00566 bool first = true;
00567
00568 for (auto app = 0; app < appFilter.size(); ++app)
00569 {
00570 msg_iters_map_t::const_iterator it = app_msgs_.find(appFilter[app]);
00571 appFilterExpression += QString(first ? "" : " || ") + appFilter[app];
00572 first = false;
00573 if (it != app_msgs_.end())
00574 {
00575 msg_iters_t temp(it->second);
00576 TRACE(10, "setFilter: app " + appFilter[app].toStdString() + " has %zu messages", temp.size());
00577 result.merge(temp);
00578 }
00579 }
00580 TRACE(10, "setFilter: result contains %zu messages", result.size());
00581
00582 first = true;
00583 if (!hostFilter.isEmpty())
00584 {
00585 msg_iters_t hostResult;
00586 for (auto host = 0; host < hostFilter.size(); ++host)
00587 {
00588 hostFilterExpression += QString(first ? "" : " || ") + hostFilter[host];
00589 first = false;
00590 msg_iters_map_t::const_iterator it = host_msgs_.find(hostFilter[host]);
00591 if (it != host_msgs_.end())
00592 {
00593 msg_iters_t temp(it->second);
00594 TRACE(10, "setFilter: host " + hostFilter[host].toStdString() + " has %zu messages", temp.size());
00595 hostResult.merge(temp);
00596 }
00597 }
00598 if (result.empty()) { result = hostResult; }
00599 else { result = list_intersect(result, hostResult); }
00600 TRACE(10, "setFilter: result contains %zu messages", result.size());
00601 }
00602
00603 first = true;
00604 if (!catFilter.isEmpty())
00605 {
00606 msg_iters_t catResult;
00607 for (auto cat = 0; cat < catFilter.size(); ++cat)
00608 {
00609 catFilterExpression += QString(first ? "" : " || ") + catFilter[cat];
00610 first = false;
00611 msg_iters_map_t::const_iterator it = cat_msgs_.find(catFilter[cat]);
00612 if (it != cat_msgs_.end())
00613 {
00614 msg_iters_t temp(it->second);
00615 TRACE(10, "setFilter: cat " + catFilter[cat].toStdString() + " has %zu messages", temp.size());
00616 catResult.merge(temp);
00617 }
00618 }
00619 if (result.empty()) { result = catResult; }
00620 else { result = list_intersect(result, catResult); }
00621 TRACE(10, "setFilter: result contains %zu messages", result.size());
00622 }
00623
00624
00625 auto nFilterExpressions = (appFilterExpression != "" ? 1 : 0) + (hostFilterExpression != "" ? 1 : 0) + (catFilterExpression != "" ? 1 : 0);
00626 QString filterExpression = "";
00627 if (nFilterExpressions == 1)
00628 {
00629 filterExpression = catFilterExpression + hostFilterExpression + appFilterExpression;
00630 }
00631 else
00632 {
00633 filterExpression = "(" + (catFilterExpression != "" ? catFilterExpression + ") && (" : "")
00634 + hostFilterExpression
00635 + (hostFilterExpression != "" && appFilterExpression != "" ? ") && (" : "")
00636 + appFilterExpression + ")";
00637 }
00638
00639
00640
00641 auto newTabTitle = QString("Filter ") + QString::number(++nFilters);
00642 QWidget* newTab = new QWidget();
00643
00644 QTextEdit* txtDisplay = new QTextEdit(newTab);
00645 QTextDocument* doc = new QTextDocument(txtDisplay);
00646 txtDisplay->setDocument(doc);
00647
00648 QVBoxLayout* layout = new QVBoxLayout();
00649 layout->addWidget(txtDisplay);
00650 layout->setContentsMargins(0, 0, 0, 0);
00651 newTab->setLayout(layout);
00652
00653 MsgFilterDisplay filteredMessages;
00654 filteredMessages.msgs = result;
00655 filteredMessages.hostFilter = hostFilter;
00656 filteredMessages.appFilter = appFilter;
00657 filteredMessages.catFilter = catFilter;
00658 filteredMessages.txtDisplay = txtDisplay;
00659 filteredMessages.nDisplayMsgs = result.size();
00660 msgFilters_.push_back(filteredMessages);
00661
00662 tabWidget->addTab(newTab, newTabTitle);
00663 tabWidget->setTabToolTip(tabWidget->count() - 1, filterExpression);
00664 tabWidget->setCurrentIndex(tabWidget->count() - 1);
00665
00666 displayMsg(msgFilters_.size() - 1);
00667 }
00668
00669 void msgViewerDlg::pause()
00670 {
00671 if (!paused)
00672 {
00673 paused = true;
00674 btnPause->setText("Resume");
00675
00676 }
00677 else
00678 {
00679 paused = false;
00680 btnPause->setText("Pause");
00681 }
00682 }
00683
00684 void msgViewerDlg::exit()
00685 {
00686 close();
00687 }
00688
00689 void msgViewerDlg::clear()
00690 {
00691 int ret = QMessageBox::question(this, tr("Message Viewer"), tr("Are you sure you want to clear all received messages?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
00692 switch (ret)
00693 {
00694 case QMessageBox::Yes:
00695 nMsgs = 0;
00696 nSupMsgs = 0;
00697 nThrMsgs = 0;
00698 msg_pool_.clear();
00699 host_msgs_.clear();
00700 cat_msgs_.clear();
00701 app_msgs_.clear();
00702 updateList<msg_iters_map_t>(lwApplication, app_msgs_);
00703 updateList<msg_iters_map_t>(lwCategory, cat_msgs_);
00704 updateList<msg_iters_map_t>(lwHost, host_msgs_);
00705 for (auto& display : msgFilters_)
00706 {
00707 display.txtDisplay->clear();
00708 display.msgs.clear();
00709 display.nDisplayMsgs = 0;
00710 }
00711
00712 lcdMsgs->display(nMsgs);
00713 lcdDisplayedMsgs->display(0);
00714 break;
00715 case QMessageBox::No:
00716 default:
00717 break;
00718 }
00719 }
00720
00721 void msgViewerDlg::shortMode()
00722 {
00723 if (!shortMode_)
00724 {
00725 shortMode_ = true;
00726 btnDisplayMode->setText("Long View");
00727 }
00728 else
00729 {
00730 shortMode_ = false;
00731 btnDisplayMode->setText("Compact View");
00732 }
00733 updateDisplays();
00734 }
00735
00736 void msgViewerDlg::changeSeverity(int sev)
00737 {
00738 switch (sev)
00739 {
00740 case SERROR:
00741 setSevError();
00742 break;
00743
00744 case SWARNING:
00745 setSevWarning();
00746 break;
00747
00748 case SINFO:
00749 setSevInfo();
00750 break;
00751
00752 default: setSevDebug();
00753 }
00754
00755 updateDisplays();
00756 }
00757
00758 void msgViewerDlg::setSevError()
00759 {
00760 sevThresh = SERROR;
00761 btnError->setChecked(true);
00762 btnWarning->setChecked(false);
00763 btnInfo->setChecked(false);
00764 btnDebug->setChecked(false);
00765 vsSeverity->setValue(sevThresh);
00766 }
00767
00768 void msgViewerDlg::setSevWarning()
00769 {
00770 sevThresh = SWARNING;
00771 btnError->setChecked(false);
00772 btnWarning->setChecked(true);
00773 btnInfo->setChecked(false);
00774 btnDebug->setChecked(false);
00775 vsSeverity->setValue(sevThresh);
00776 }
00777
00778 void msgViewerDlg::setSevInfo()
00779 {
00780 sevThresh = SINFO;
00781 btnError->setChecked(false);
00782 btnWarning->setChecked(false);
00783 btnInfo->setChecked(true);
00784 btnDebug->setChecked(false);
00785 vsSeverity->setValue(sevThresh);
00786 }
00787
00788 void msgViewerDlg::setSevDebug()
00789 {
00790 sevThresh = SDEBUG;
00791 btnError->setChecked(false);
00792 btnWarning->setChecked(false);
00793 btnInfo->setChecked(false);
00794 btnDebug->setChecked(true);
00795 vsSeverity->setValue(sevThresh);
00796 }
00797
00798 void msgViewerDlg::renderMode()
00799 {
00800 simpleRender = !simpleRender;
00801
00802 if (simpleRender)
00803 {
00804 btnRMode->setChecked(true);
00805 for (auto display : msgFilters_)
00806 {
00807 display.txtDisplay->setPlainText(display.txtDisplay->toPlainText());
00808 }
00809 }
00810 else
00811 {
00812 btnRMode->setChecked(false);
00813 updateDisplays();
00814 }
00815 }
00816
00817 void msgViewerDlg::searchMsg()
00818 {
00819 QString search = editSearch->text();
00820
00821 if (search.isEmpty())
00822 return;
00823
00824 auto display = tabWidget->currentIndex();
00825 if (search != searchStr)
00826 {
00827 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
00828 if (!msgFilters_[display].txtDisplay->find(search))
00829 {
00830 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
00831 searchStr = "";
00832 }
00833 else
00834 searchStr = search;
00835 }
00836 else
00837 {
00838 if (!msgFilters_[display].txtDisplay->find(search))
00839 {
00840 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::Start);
00841 if (!msgFilters_[display].txtDisplay->find(search))
00842 {
00843 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
00844 searchStr = "";
00845 }
00846 }
00847 }
00848 }
00849
00850 void msgViewerDlg::searchClear()
00851 {
00852 auto display = tabWidget->currentIndex();
00853 editSearch->setText("");
00854 searchStr = "";
00855 msgFilters_[display].txtDisplay->find("");
00856 msgFilters_[display].txtDisplay->moveCursor(QTextCursor::End);
00857 }
00858
00859 void msgViewerDlg::setSuppression(QAction* act)
00860 {
00861 bool status = act->isChecked();
00862 suppress* sup = (suppress *)act->data().value<void*>();
00863 sup->use(status);
00864 }
00865
00866 void msgViewerDlg::setThrottling(QAction* act)
00867 {
00868 bool status = act->isChecked();
00869 throttle* thr = (throttle *)act->data().value<void*>();
00870 thr->use(status);
00871 }
00872
00873 void msgViewerDlg::tabWidgetCurrentChanged(int newTab)
00874 {
00875 lcdDisplayedMsgs->display(msgFilters_[newTab].nDisplayMsgs);
00876
00877 lwHost->setCurrentRow(-1, QItemSelectionModel::Clear);
00878 lwApplication->setCurrentRow(-1, QItemSelectionModel::Clear);
00879 lwCategory->setCurrentRow(-1, QItemSelectionModel::Clear);
00880
00881 for (auto host : msgFilters_[newTab].hostFilter)
00882 {
00883 auto items = lwHost->findItems(host, Qt::MatchExactly);
00884 if (items.size() > 0)
00885 {
00886 items[0]->setSelected(true);
00887 }
00888 }
00889 for (auto app : msgFilters_[newTab].appFilter)
00890 {
00891 auto items = lwApplication->findItems(app, Qt::MatchExactly);
00892 if (items.size() > 0)
00893 {
00894 items[0]->setSelected(true);
00895 }
00896 }
00897 for (auto cat : msgFilters_[newTab].catFilter)
00898 {
00899 auto items = lwCategory->findItems(cat, Qt::MatchExactly);
00900 if (items.size() > 0)
00901 {
00902 items[0]->setSelected(true);
00903 }
00904 }
00905 }
00906
00907 void msgViewerDlg::tabCloseRequested(int tabIndex)
00908 {
00909 if (tabIndex == 0 || static_cast<size_t>(tabIndex) >= msgFilters_.size()) return;
00910
00911 auto widget = tabWidget->widget(tabIndex);
00912 tabWidget->removeTab(tabIndex);
00913 delete widget;
00914
00915 msgFilters_.erase(msgFilters_.begin() + tabIndex);
00916 }
00917
00918 void msgViewerDlg::closeEvent(QCloseEvent* event)
00919 {
00920 event->accept();
00921 }
00922
00923 QStringList msgViewerDlg::toQStringList(QList<QListWidgetItem *> in)
00924 {
00925 QStringList out;
00926
00927 for (auto i = 0; i < in.size(); ++i)
00928 {
00929 out << in[i]->text();
00930 }
00931
00932 return out;
00933 }