void MessageBox::createConfig(std::ostream& config) { config << ",title:" << windowTitle().jsStringLiteral(); if (!text_.empty()) config << ",msg:" << text_.jsStringLiteral(); if (prompt_) config << ",prompt:true"; if (textArea_) config << ",multiline:true"; if (prompt_ || textArea_) config << ",value:" << value_.jsStringLiteral(); if (progress_) config << ",progress:true"; if (buttons_ != NoButton) { config << ",buttons:{a:0"; if (buttons_ & Ok) config << ",ok:" + jsStringLiteral(buttonText(0), '\''); if (buttons_ & Cancel) config << ",cancel:" + jsStringLiteral(buttonText(3), '\''); if (buttons_ & Yes) config << ",yes:" + jsStringLiteral(buttonText(1), '\''); if (buttons_ & No) config << ",no:" + jsStringLiteral(buttonText(2), '\''); config << "}"; } config << ",fn:function(b,v){" << extButtonClicked_.createCall("b","v") << "}"; }
void WAbstractSpinBox::refresh() { doJavaScript ("jQuery.data(" + jsRef() + ", 'obj')" ".setLocale(" + jsStringLiteral(WLocale::currentLocale().decimalPoint()) + "," + jsStringLiteral(WLocale::currentLocale().groupSeparator()) + ");"); WLineEdit::refresh(); }
void DateField::createConfig(std::ostream& config) { if (!validator()) config << ",format:" << jsStringLiteral(WDate::extFormat(format_), '\''); LineEdit::createConfig(config); }
void WTextEdit::updateDom(DomElement& element, bool all) { WTextArea::updateDom(element, all); if (element.type() == DomElement_TEXTAREA) element.removeProperty(PropertyStyleDisplay); // we are creating the actual element if (all && element.type() == DomElement_TEXTAREA) { std::stringstream config; config << "{"; bool first = true; for (SettingsMapType::const_iterator it = configurationSettings_.begin(); it != configurationSettings_.end(); ++it) { if (it->first == "plugins") continue; if (!first) config << ','; first = false; config << it->first << ": " << Impl::asJSLiteral(it->second, XHTMLUnsafeText); } if (!first) config << ','; config << "plugins: '" << plugins() << "'"; config << ",init_instance_callback: obj.init" "}"; DomElement dummy(DomElement::ModeUpdate, DomElement_TABLE); updateDom(dummy, true); element.callJavaScript("(function() { " """var obj = $('#" + id() + "').data('obj');" """obj.render(" + config.str() + "," + jsStringLiteral(dummy.cssStyle()) + "," + (changed().isConnected() ? "true" : "false") + ");" "})();"); contentChanged_ = false; } if (!all && contentChanged_) { element.callJavaScript(jsRef() + ".ed.load();"); contentChanged_ = false; } }
void WAbstractSpinBox::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WSpinBox.js", "WSpinBox", wtjs1); WStringStream ss; ss << "new " WT_CLASS ".WSpinBox(" << app->javaScriptClass() << "," << jsRef() << "," << decimals() << "," << prefix().jsStringLiteral() << "," << suffix().jsStringLiteral() << "," << jsMinMaxStep() << "," << jsStringLiteral(WLocale::currentLocale().decimalPoint()) << "," << jsStringLiteral(WLocale::currentLocale().groupSeparator()) << ");"; setJavaScriptMember(" WSpinBox", ss.str()); }
void WPushButton::renderHRef(DomElement& element) { if (!linkState_.link.isNull() && !isDisabled()) { WApplication *app = WApplication::instance(); if (!linkState_.clickJS) { linkState_.clickJS = new JSlot(); clicked().connect(*linkState_.clickJS); if (!app->environment().ajax()) clicked().connect(this, &WPushButton::doRedirect); } if (linkState_.link.type() == WLink::InternalPath) linkState_.clickJS->setJavaScript ("function(){" + app->javaScriptClass() + "._p_.setHash(" + jsStringLiteral(linkState_.link.internalPath()) + ",true);" "}"); else { std::string url = linkState_.link.resolveUrl(app); if (linkState_.link.target() == TargetNewWindow) linkState_.clickJS->setJavaScript ("function(){" "window.open(" + jsStringLiteral(url) + ");" "}"); else linkState_.clickJS->setJavaScript ("function(){" "window.location=" + jsStringLiteral(url) + ";" "}"); } clicked().senderRepaint(); // XXX only for Java port necessary } else { delete linkState_.clickJS; linkState_.clickJS = 0; } }
void WFormWidget::validatorChanged() { std::string validateJS = validator_->javaScriptValidate(); if (!validateJS.empty()) { setJavaScriptMember("wtValidate", validateJS); if (!validateJs_) { validateJs_ = new JSlot(); validateJs_->setJavaScript("function(o){" WT_CLASS ".validate(o)}"); keyWentUp().connect(*validateJs_); changed().connect(*validateJs_); if (domElementType() != DomElement_SELECT) clicked().connect(*validateJs_); } else if (isRendered()) validateJs_->exec(jsRef()); } else { delete validateJs_; validateJs_ = 0; } std::string inputFilter = validator_->inputFilter(); if (!inputFilter.empty()) { if (!filterInput_) { filterInput_ = new JSlot(); keyPressed().connect(*filterInput_); } Wt::Utils::replace(inputFilter, '/', "\\/"); filterInput_->setJavaScript ("function(o,e){" WT_CLASS ".filter(o,e," + jsStringLiteral(inputFilter) + ")}"); } else { delete filterInput_; filterInput_ = 0; } validate(); }
void DomElement::jsStringLiteral(EscapeOStream& out, const std::string& s, char delimiter) { /* * How to convert a random piece of text in a well-behaved javascript * string ? * 1. Replace \ -> \\ * 2. Remove newlines -> \n * 3. Remove carriage returns -> \r * 4. Remove tab characters -> \t * 5. Replace delimiter -> \delimiter */ out << delimiter; EscapeOStreamScope scope = jsStringLiteral(out, delimiter); out << s; scope.pop(); out << delimiter; }
std::string DomElement::asJavaScript(EscapeOStream& out, Priority priority) const { switch(priority) { case Delete: if (deleted_ || removeAllChildren_) { out << declare(); if (deleted_) { out << var_ << ".parentNode.removeChild(" << var_ << ");"; } else if (removeAllChildren_) { out << "while (" << var_ << ".firstChild) {" << var_ << ".removeChild(" << var_ << ".firstChild);" << "}"; } } return var_; break; case Create: if (mode_ == ModeCreate) { out << declare(); if (id_.length() != 0) out << var_ << ".setAttribute('id', '" << id_ << "');"; } return var_; break; case Update: { /* * short-cut for frequent short manipulations */ if (mode_ == ModeUpdate && numManipulations_ == 1) { if (properties_.find(Wt::PropertyStyleDisplay) != properties_.end()) { std::string style = properties_.find(Wt::PropertyStyleDisplay)->second; if (style == "none") { out << "hide('" << id_ << "');"; return var_; } else if (style == "inline") { out << "inline('" + id_ + "');"; return var_; } else if (style == "block") { out << "block('" + id_ + "');"; return var_; } } } processEvents(); if (deleted_) break; if (replaced_) { declare(out); std::string varr = replaced_->asJavaScript(out, Create); replaced_->asJavaScript(out, Update); out << varr << ".style.display = " << var_ << ".style.display;"; out << var_ << ".parentNode.replaceChild(" << varr << "," << var_ << ");"; return var_; } else if (insertBefore_) { declare(out); std::string varr = insertBefore_->asJavaScript(out, Create); insertBefore_->asJavaScript(out, Update); out << var_ << ".parentNode.insertBefore(" << varr << "," << var_ + ");"; return var_; } const AttributeMap& attributesToSet = attributes_; for (AttributeMap::const_iterator i = attributesToSet.begin(); i != attributesToSet.end(); ++i) { declare(out); if (i->first == "class") { out << var_ << ".className = "; jsStringLiteral(out, i->second, '\''); out << ";"; } else { out << var_ << ".setAttribute('" << i->first << "',"; jsStringLiteral(out, i->second, '\''); out << ");"; } } for (EventHandlerMap::const_iterator i = eventHandlers_.begin(); i != eventHandlers_.end(); ++i) { if ((mode_ == ModeUpdate) || (i->second.first.length() > 0)) { declare(out); std::string fName = "f" + boost::lexical_cast<std::string>(nextId_++); out << "function " << fName << "(event) { if (!event) event = window.event; " << i->second.first << "}"; out << var_ << ".on" << i->first << "=" << fName << ";"; } } if ((mode_ == ModeCreate || wasEmpty_) && canWriteInnerHTML()) { if (!childrenToAdd_.empty() || !childrenHtml_.empty()) { declare(out); out << var_ << ".innerHTML=\'"; EscapeOStreamScope scope = jsStringLiteral(out, '\''); out << childrenHtml_; TimeoutList timeouts; for (unsigned i = 0; i < childrenToAdd_.size(); ++i) childrenToAdd_[i].second->asHTML(out, timeouts); scope.pop(); out << "\';"; createTimeoutJs(out, timeouts); } } else { for (unsigned i = 0; i < childrenToAdd_.size(); ++i) { declare(out); DomElement *child = childrenToAdd_[i].second; std::string cvar = child->asJavaScript(out, Create); child->asJavaScript(out, Update); if (childrenToAdd_[i].first.length() > 0) { DomElement *beforeElement = getForUpdate(childrenToAdd_[i].first, DIV); out << var_ << ".insertBefore(" << cvar << "," << beforeElement->createReference() << ");"; delete beforeElement; } else { out << var_ << ".appendChild(" << cvar << ");"; } } } for (PropertyMap::const_iterator i = properties_.begin(); i != properties_.end(); ++i) { declare(out); std::string p; std::string value; switch(i->first) { case Wt::PropertyInnerHTML: out << var_ << ".innerHTML="; jsStringLiteral(out, i->second, '\''); out << ';'; break; case Wt::PropertyValue: out << var_ << ".value="; jsStringLiteral(out, i->second, '\''); out << ';'; break; case Wt::PropertyDisabled: out << var_ << ".disabled=" << i->second << ';'; break; case Wt::PropertyChecked: out << var_ << ".checked=" << i->second << ';'; break; case Wt::PropertySelected: out << var_ << ".selected=" << i->second << ';'; break; case Wt::PropertySelectedIndex: out << var_ << ".selectedIndex=" << i->second << ';'; break; case Wt::PropertySrc: out << var_ << ".src='" << i->second << "\';"; break; case Wt::PropertyText: out << var_ << ".text="; jsStringLiteral(out, i->second, '\''); out << ';'; break; default: if ((i->first >= Wt::PropertyStylePosition) && (i->first <= Wt::PropertyStyleDisplay)) { static std::string cssNames[] = { "position", "zIndex", "float", "clear", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "left", "right", "top", "bottom", "verticalAlign", "textAlign", "padding", "marginTop", "marginRight", "marginBottom", "marginLeft", "cursor", "borderTop", "borderRight", "borderBottom", "borderLeft", "color", "overflow", "overflow", "fontFamily", "fontStyle", "fontVariant", "fontWeight", "fontSize", "backgroundColor", "backgroundImage", "backgroundRepeat", "backgroundPosition", "textDecoration", "tableLayout", "borderSpacing", "display" }; out << var_ << ".style." << cssNames[i->first - Wt::PropertyStylePosition] << "=\'" << i->second << "\';"; } } } for (unsigned i = 0; i < methodCalls_.size(); ++i) { declare(out); out << var_ << "." << methodCalls_[i] << ';'; } if (timeOut_ != -1) out << "addTimerEvent('" << id_ << "', " << boost::lexical_cast<std::string>(timeOut_) + ");"; out << javaScript_; return var_; } } return var_; }
void DomElement::jsStringLiteral(std::ostream& out, const std::string& s, char delimiter) { EscapeOStream sout(out); jsStringLiteral(sout, s, delimiter); }
void WPushButton::updateDom(DomElement& element, bool all) { if (all) { element.setAttribute("type", "button"); element.setProperty(PropertyClass, "Wt-btn"); } if (flags_.test(BIT_ICON_CHANGED) || (all && !icon_.isNull())) { DomElement *image = DomElement::createNew(DomElement_IMG); image->setProperty(PropertySrc, icon_.url()); image->setId("im" + formName()); element.insertChildAt(image, 0); flags_.set(BIT_ICON_RENDERED); } if (flags_.test(BIT_TEXT_CHANGED) || all) { element .setProperty(Wt::PropertyInnerHTML, text_.literal() ? escapeText(text_, true).toUTF8() : text_.toUTF8()); flags_.reset(BIT_TEXT_CHANGED); } if (flags_.test(BIT_LINK_CHANGED) || (all && !link_.isNull())) { if (!link_.isNull()) { WApplication *app = WApplication::instance(); if (!redirectJS_) { redirectJS_ = new JSlot(); clicked().connect(*redirectJS_); if (!app->environment().ajax()) clicked().connect(this, &WPushButton::doRedirect); } if (link_.type() == WLink::InternalPath) redirectJS_->setJavaScript ("function(){" WT_CLASS ".history.navigate(" + jsStringLiteral(link_.internalPath()) + ",true);" "}"); else if (linkTarget_ == TargetNewWindow) redirectJS_->setJavaScript ("function(){" "window.open(" + jsStringLiteral(link_.url()) + ");" "}"); else redirectJS_->setJavaScript ("function(){" "window.location=" + jsStringLiteral(link_.url()) + ";" "}"); clicked().senderRepaint(); // XXX only for Java port necessary } else { delete redirectJS_; redirectJS_ = 0; } } WFormWidget::updateDom(element, all); }