void WAbstractToggleButton::updateDom(DomElement& element, bool all) { if (checkedChanged_ || all) { element.setProperty(Wt::PropertyChecked, checked_ ? "true" : "false"); checkedChanged_ = false; } const WSignalInstance_ *changeS = getSignal(SIGNAL(changed())); const WSignalInstance_ *checkedS = getSignal(SIGNAL(checked())); const WSignalInstance_ *unCheckedS = getSignal(SIGNAL(unChecked())); bool needUpdateChangeSignal = (changeS->connectivityChanged() || checkedS->connectivityChanged() || unCheckedS->connectivityChanged() || changeS->staticCodeChanged() || checkedS->staticCodeChanged() || unCheckedS->staticCodeChanged()); WFormWidget::updateDom(element, all); if (needUpdateChangeSignal || all) { element.removeEventSignal("change"); DomElement *e = DomElement::getForUpdate(this, DomElement::INPUT); if (isConnected(changeS)) element.addEventSignal("change", *changeS, 0, 0); if (isConnected(checkedS)) element.addEventSignal("change", *checkedS, 0, (e->createReference() + ".checked == true").c_str()); if (isConnected(unCheckedS)) element.addEventSignal("change", *unCheckedS, 0, (e->createReference() + ".checked == false").c_str()); delete e; } }
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_; }