#include "GWt_console.h" #include #include #include #include #include #include #include #include #include #include GWt_console::GWt_console() :WContainerWidget() { setObjectName("console"); // la ligne de search Wt::WContainerWidget *searchContainer = new Wt::WContainerWidget(); Wt::WLabel *label = new Wt::WLabel("Search ", searchContainer); searchLineEdit_ = new Wt::WLineEdit("", searchContainer); searchLineEdit_->setToolTip("clic here to search a string in the output"); // le panel WPanel *panelConsole = new WPanel(this); panelConsole->setTitle(" output"); WScrollArea* scrollContainer = new WScrollArea(); outputCurrent_ = new WText(this); outputCurrent_->setTextFormat(Wt::XHTMLText); outputCurrent_->setInline(false); outputCurrent_->setMaximumSize(750,400); scrollContainer->setWidget(outputCurrent_); scrollContainer->setStyleClass("scrollConsole"); Wt::WContainerWidget *panelContainer = new Wt::WContainerWidget(); Wt::WVBoxLayout* vContainerLayout = new Wt::WVBoxLayout(); vContainerLayout->addWidget(searchContainer); vContainerLayout->addWidget(scrollContainer); panelContainer->setLayout(vContainerLayout); panelConsole->setCentralWidget(panelContainer); // signals searchLineEdit_->keyWentUp ().connect(this, &GWt_console::searchFilter); } GWt_console::~GWt_console() { } void GWt_console::searchFilter() { std::string br = "
"; std::string txt = searchLineEdit_->text().toUTF8 (); if (searchLineEdit_->text() == "") { outputCurrent_->setText(outputOriginal_); outputCurrent_->setTextFormat(Wt::XHTMLText); return; } std::string outputStr = outputOriginal_.toUTF8(); std::string outputFinal = ""; // look for lines that contains the seacrh string bool end = false; int nextPos = 0; int nextPosTxt = 0; int lineNumber = 0; std::string beginStr; std::string endStr; // loop on all lines while (end == false) { lineNumber++; nextPos = outputStr.find(br); // if this line contains the token if (nextPos != std::string::npos) { beginStr = outputStr.substr(0,nextPos); endStr = outputStr.substr(nextPos+br.size()); outputStr = endStr; // colorize for all token bool lineEnd = false; std::string colorizeTxt = ""; while (lineEnd == false) { nextPosTxt = beginStr.find(txt); if (nextPosTxt != std::string::npos) { colorizeTxt += beginStr.substr(0,nextPosTxt)+ std::string("")+ txt+ std::string(""); beginStr = beginStr.substr(nextPosTxt+txt.size()); } else if (colorizeTxt != "") { colorizeTxt += beginStr; lineEnd = true; } else { lineEnd = true; } } if (colorizeTxt != "") { std::stringstream ss; ss << lineNumber; outputFinal += std::string("line ")+ss.str()+" : "+colorizeTxt+br; } } else { end = true; } } outputCurrent_->setText(outputFinal); outputCurrent_->setTextFormat(Wt::XHTMLText); } void GWt_console::addConsoleMessage(WString msg) { // changes specials caracters outputOriginal_ += Wt::Utils::htmlEncode (msg.toUTF8(), Wt::Utils::EncodeNewLines); // apply filter, will modify outputCurrent searchFilter(); /* * Little javascript trick to make sure we scroll along with new content */ wApp->doJavaScript(outputCurrent_->jsRef() + ".scrollTop += " + outputCurrent_->jsRef() + ".scrollHeight;"); }