void WPopupMenu::prepareRender(WApplication *app) { if (app->environment().agentIsIE()) { doJavaScript(jsRef() + ".lastChild.style.width=" + jsRef() + ".lastChild.offsetWidth + 'px';"); } // FIXME: we should really also prepareRender() of submenus when shown... if (!cancel_.isConnected()) { LOAD_JAVASCRIPT(app, "js/WPopupMenu.js", "WPopupMenu", wtjs1); std::vector<WPopupMenu *> subMenus; getSubMenus(subMenus); WStringStream s; s << "new " WT_CLASS ".WPopupMenu(" << app->javaScriptClass() << ',' << jsRef() << ',' << autoHideDelay_ << ",["; for (unsigned i = 0; i < subMenus.size(); ++i) { if (i != 0) s << ','; s << WWebWidget::jsStringLiteral(subMenus[i]->id()); } s << "]);"; setJavaScriptMember(" WPopupMenu", s.str()); cancel_.connect(this, &WPopupMenu::done); } }
void WPopupWidget::setHidden(bool hidden, const WAnimation& animation) { if (WWebWidget::canOptimizeUpdates() && hidden == isHidden()) return; WCompositeWidget::setHidden(hidden, animation); if (!hidden && anchorWidget_) positionAt(anchorWidget_, orientation_); if (hidden) this->hidden().emit(); else this->shown().emit(); if (!WWebWidget::canOptimizeUpdates() || isRendered()) { if (hidden) doJavaScript("var o = jQuery.data(" + jsRef() + ", 'popup');" "if (o) o.hidden();"); else doJavaScript("var o = jQuery.data(" + jsRef() + ", 'popup');" "if (o) o.shown();"); } if (!WWebWidget::canOptimizeUpdates() && hidden && deleteWhenHidden_) delete this; }
std::string WImage::updateAreasJS() { WStringStream ss; if (!targetJS_.empty()) { ss << "(function(){" """var w = " << jsRef() << ";" """if (w) {" "" "var o = jQuery.data(" << jsRef() << ", 'obj');" "" "if (o) { o.updateAreas(); }" """}" "})();"; } return ss.str(); }
Popup & Popup::setHTML(C Wt::WString & content) { std::stringstream stream; stream << jsRef() << ".popup.setHTML(" << Quote(content) << ");"; doDelayedJavaScript(stream.str()); return *this; }
void WFormWidget::setEmptyText(const WString& emptyText) { emptyText_ = emptyText; WApplication* app = WApplication::instance(); const WEnvironment& env = app->environment(); if (env.ajax()) { if (!emptyText_.empty()) { if (!flags_.test(BIT_JS_OBJECT)) defineJavaScript(); else updateEmptyText(); if (!removeEmptyText_) { removeEmptyText_ = new JSlot(this); focussed().connect(*removeEmptyText_); blurred().connect(*removeEmptyText_); keyWentDown().connect(*removeEmptyText_); std::string jsFunction = "function(obj, event) {" """jQuery.data(" + jsRef() + ", 'obj').applyEmptyText();" "}"; removeEmptyText_->setJavaScript(jsFunction); } } else { delete removeEmptyText_; removeEmptyText_ = 0; } } else { setToolTip(emptyText); } }
void Popup::render(Wt::WFlags<Wt::RenderFlag> flags) { Wt::WApplication * app = Wt::WApplication::instance(); Wt::WString initFunction = app->javaScriptClass() + ".init_popup_" + id(); Wt::WStringStream stream; stream << "{" << initFunction.toUTF8() << " = function() {" << " var self = " << jsRef() << ";" << " if (!self) {" << " setTimeout(" << initFunction.toUTF8() << ", 0);" << " }"; stream << " self.popup = new mapboxgl.Popup( {" << " closeButton: " << ToScript(closeButton_).toUTF8() << ", " << " closeOnClick: " << ToScript(closeOnClick_).toUTF8() << ", " << " anchor: " << ToScript(anchor_).toUTF8() << " });"; for (unsigned int i = 0; i < additions_.size(); i++) { stream << additions_[i].toUTF8(); } additions_.clear(); stream << " setTimeout(function(){ delete " << initFunction.toUTF8() << ";}, 0)};\n" << "}\n" << initFunction.toUTF8() << "();\n"; app->doJavaScript(stream.str()); }
WPainterPath WTransform::map(const WPainterPath& path) const { if (isIdentity()) return path; WPainterPath result; if (isJavaScriptBound() || path.isJavaScriptBound()) { const WJavaScriptExposableObject *o = this; if (!isJavaScriptBound()) o = &path; result.assignBinding(*o, WT_CLASS ".gfxUtils.transform_apply(" + jsRef() + ',' + path.jsRef() + ')'); } const std::vector<WPainterPath::Segment> &sourceSegments = path.segments(); for (std::size_t i = 0; i < sourceSegments.size(); ++i) { double tx, ty; if (sourceSegments[i].type() == WPainterPath::Segment::ArcR || sourceSegments[i].type() == WPainterPath::Segment::ArcAngleSweep) { result.segments_.push_back(sourceSegments[i]); } else { map(sourceSegments[i].x(), sourceSegments[i].y(), &tx, &ty); result.segments_.push_back(WPainterPath::Segment(tx, ty, sourceSegments[i].type())); } } return result; }
void WStackedWidget::defineJavaScript() { if (!javaScriptDefined_) { javaScriptDefined_ = true; WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WStackedWidget.js", "WStackedWidget", wtjs1); setJavaScriptMember(" WStackedWidget", "new " WT_CLASS ".WStackedWidget(" + app->javaScriptClass() + "," + jsRef() + ");"); setJavaScriptMember(WT_RESIZE_JS, "$('#" + id() + "').data('obj').wtResize"); setJavaScriptMember(WT_GETPS_JS, "$('#" + id() + "').data('obj').wtGetPs"); if (!animation_.empty()) { loadAnimateJS(); setJavaScriptMember("wtAnimateChild", "$('#" + id() + "').data('obj').animateChild"); setJavaScriptMember("wtAutoReverse", autoReverseAnimation_ ? "true" : "false"); } } }
std::string WTextEdit::renderRemoveJs() { if (isRendered()) return jsRef() + ".ed.remove();" WT_CLASS ".remove('" + id() + "');"; else return WTextArea::renderRemoveJs(); }
void WLineEdit::setInputMask(const WT_USTRING &mask, WFlags<InputMaskFlag> flags) { inputMaskFlags_ = flags; if (inputMask_ != mask) { inputMask_ = mask; mask_.clear(); raw_.clear(); case_.clear(); spaceChar_ = ' '; WT_USTRING textBefore; if (!inputMask_.empty()) { textBefore = displayText(); processInputMask(); setText(textBefore); } if (isRendered() && javaScriptDefined_) { std::u32string space; space += spaceChar_; doJavaScript("jQuery.data(" + jsRef() + ", 'lobj')" ".setInputMask(" + WWebWidget::jsStringLiteral(mask_) + "," + WWebWidget::jsStringLiteral(raw_) + "," + WWebWidget::jsStringLiteral(displayContent_) + "," + WWebWidget::jsStringLiteral(case_) + "," + WWebWidget::jsStringLiteral(space) + ", true);"); } else if (!inputMask_.empty()) repaint(); } }
void WLineEdit::defineJavaScript() { if (javaScriptDefined_) return; javaScriptDefined_ = true; WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WLineEdit.js", "WLineEdit", wtjs1); std::u32string space; space += spaceChar_; std::string jsObj = "new " WT_CLASS ".WLineEdit(" + app->javaScriptClass() + "," + jsRef() + "," + WWebWidget::jsStringLiteral(mask_) + "," + WWebWidget::jsStringLiteral(raw_) + "," + WWebWidget::jsStringLiteral(displayContent_) + "," + WWebWidget::jsStringLiteral(case_) + "," + WWebWidget::jsStringLiteral(space) + "," + (inputMaskFlags_.test(InputMaskFlag::KeepMaskWhileBlurred) ? "0x1" : "0x0") + ");"; setJavaScriptMember(" WLineEdit", jsObj); #ifdef WT_CNOR EventSignalBase& b = mouseMoved(); EventSignalBase& c = keyWentDown(); #endif connectJavaScript(keyWentDown(), "keyDown"); connectJavaScript(keyPressed(), "keyPressed"); connectJavaScript(focussed(), "focussed"); connectJavaScript(blurred(), "blurred"); connectJavaScript(clicked(), "clicked"); }
WRectF WTransform::map(const WRectF& rect) const { if (isIdentity()) return rect; double minX, minY, maxX, maxY; WPointF p = map(rect.topLeft()); minX = maxX = p.x(); minY = maxY = p.y(); for (unsigned i = 0; i < 3; ++i) { WPointF p2 = map(i == 0 ? rect.bottomLeft() : i == 1 ? rect.topRight() : rect.bottomRight()); minX = std::min(minX, p2.x()); maxX = std::max(maxX, p2.x()); minY = std::min(minY, p2.y()); maxY = std::max(maxY, p2.y()); } WRectF result(minX, minY, maxX - minX, maxY - minY); if (isJavaScriptBound() || rect.isJavaScriptBound()) { const WJavaScriptExposableObject *o = this; if (rect.isJavaScriptBound()) o = ▭ result.assignBinding(*o, WT_CLASS ".gfxUtils.transform_mult(" + jsRef() + ',' + rect.jsRef() + ')'); } return result; }
void WTreeTable::render(WFlags<RenderFlag> flags) { if (flags.test(RenderFlag::Full)) { defineJavaScript(); setJavaScriptMember(WT_RESIZE_JS, jsRef() + ".wtObj.wtResize"); resize(width(), height()); WApplication::instance()->addAutoJavaScript ("{var obj = " + jsRef() + ";" "if (obj && obj.wtObj) obj.wtObj.autoJavaScript();}"); } WCompositeWidget::render(flags); }
std::string WGLWidget::glObjJsRef() const { return "(function(){" "var r = " + jsRef() + ";" "var o = r ? r.wtObj : null;" "return o ? o : {ctx: null};" "})()"; }
Popup & Popup::pos(C Coordinate & value) { std::stringstream stream; stream << jsRef() << ".popup.setLngLat(" << ToScript(value) << ");"; doDelayedJavaScript(stream.str()); pos_ = value; return *this; }
std::string WImage::setAreaCoordsJS() { WStringStream ss; if (!targetJS_.empty()) { ss << "jQuery.data(" << jsRef() << ", 'obj').setAreaCoordsJSON(" << updateAreaCoordsJSON() << ");"; } return ss.str(); }
std::string WTimerWidget::renderRemoveJs() { return "{" "var obj=" + jsRef() + ";" "if (obj && obj.timer) {" """clearTimeout(obj.timer);" """obj.timer = null;" "}" WT_CLASS ".remove('" + id() + "');}"; }
void WFormWidget::updateDom(DomElement& element, bool all) { const WEnvironment& env = WApplication::instance()->environment(); bool onChangeHandledElsewhere = dynamic_cast<WAbstractToggleButton *>(this); if (!onChangeHandledElsewhere) { EventSignal<> *s = voidEventSignal(CHANGE_SIGNAL, false); if (s) updateSignalConnection(element, *s, "change", all); } if (flags_.test(BIT_ENABLED_CHANGED) || all) { if (!all || !isEnabled()) element.setProperty(Wt::PropertyDisabled, isEnabled() ? "false" : "true"); if (!all && isEnabled() && env.agentIsIE()) { /* * FIXME: implement a workaround for IE, reenabling a checkbox makes * the input box loose interactivity. */ } flags_.reset(BIT_ENABLED_CHANGED); } if (flags_.test(BIT_READONLY_CHANGED) || all) { if (!all || isReadOnly()) element.setProperty(Wt::PropertyReadOnly, isReadOnly() ? "true" : "false"); flags_.reset(BIT_READONLY_CHANGED); } if (flags_.test(BIT_TABINDEX_CHANGED) || all) { if (!all || tabIndex_) element.setProperty(PropertyTabIndex, boost::lexical_cast<std::string>(tabIndex_)); flags_.reset(BIT_TABINDEX_CHANGED); } if (isEnabled()) { if (all && flags_.test(BIT_GOT_FOCUS)) flags_.set(BIT_INITIAL_FOCUS); if (flags_.test(BIT_GOT_FOCUS) || (all && flags_.test(BIT_INITIAL_FOCUS))) { element.callJavaScript("setTimeout(function() {" """var f = " + jsRef() + ";" """if (f) try { f.focus(); } catch (e) { } }, " + (env.agentIsIElt(9) ? "500" : "10") + ");"); flags_.reset(BIT_GOT_FOCUS); } } WInteractWidget::updateDom(element, all); }
void WPopupMenu::setHidden(bool hidden, const WAnimation& animation) { WCompositeWidget::setHidden(hidden, animation); if (cancel_.isConnected() || WApplication::instance()->session()->renderer().preLearning()) doJavaScript("jQuery.data(" + jsRef() + ", 'obj').setHidden(" + (hidden ? "1" : "0") + ");"); }
void WWidget::setJsSize() { if (!height().isAuto() && height().unit() != WLength::Percentage && !javaScriptMember(WT_RESIZE_JS).empty()) callJavaScriptMember (WT_RESIZE_JS, jsRef() + "," + boost::lexical_cast<std::string>(width().toPixels()) + "," + boost::lexical_cast<std::string>(height().toPixels())); }
void WTreeTable::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WTreeTable.js", "WTreeTable", wtjs1); setJavaScriptMember(" WTreeTable", "new " WT_CLASS ".WTreeTable(" + app->javaScriptClass() + "," + jsRef() + ");"); }
void WSuggestionPopup::doFilter(std::string input) { filtering_ = true; filterModel_.emit(WT_USTRING::fromUTF8(input)); filtering_ = false; doJavaScript("jQuery.data(" + jsRef() + ", 'obj').filtered(" + WWebWidget::jsStringLiteral(input) + ");"); }
void Recaptcha::update_impl() { if (!implementation()) { setImplementation(new WContainerWidget()); } get_impl()->clear(); WText* title = new WText("reCAPTCHA", get_impl()); title->addStyleClass("wc_recaptcha_title"); if (js()) { WContainerWidget* image = new WContainerWidget(get_impl()); image->setId("recaptcha_image"); response_field_ = input_ ? input_ : new WLineEdit(get_impl()); challenge_field_ = new WLineEdit(get_impl()); // not challenge_field_->hide() to get its .text() doJavaScript("$(" + challenge_field_->jsRef() + ").hide();"); response_field_->setId("recaptcha_response_field"); doJavaScript("Recaptcha.create('" + public_key_ + "', ''," "{theme: 'custom'});"); if (buttons_enabled_) { add_buttons(); } doJavaScript("clearTimeout($(" + jsRef() + ").data('timer'));"); doJavaScript("$(" + jsRef() + ").data('timer'," "setInterval(function() {" "$(" + challenge_field_->jsRef() + ")" ".val(Recaptcha.get_challenge());" "}, 200));"); } else { WTemplate* iframe = new WTemplate(get_impl()); iframe->setTemplateText("<iframe src='https://www.google.com/recaptcha/" "api/noscript?k=" + public_key_ + "' height='300' width='500' frameborder='0'>" "</iframe>", XHTMLUnsafeText); if (input_) { challenge_field_ = input_; } else { WTextArea* ta = new WTextArea(get_impl()); ta->setColumns(40); ta->setRows(3); challenge_field_ = ta; } response_field_ = new WLineEdit("manual_challenge", get_impl()); response_field_->hide(); } }
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 WPopupMenu::popup(WWidget *location, Orientation orientation) { location_ = location; popupImpl(); doJavaScript("jQuery.data(" + jsRef() + ", 'obj').popupAt(" + location->jsRef() + ");"); positionAt(location, orientation); }
std::string WTextEdit::renderRemoveJs(bool recursive) { if (isRendered()) { std::string result = jsRef() + ".ed.remove();"; if (!recursive) result += WT_CLASS ".remove('" + id() + "');"; return result; } else return WTextArea::renderRemoveJs(recursive); }
void WSuggestionPopup::connectObjJS(EventSignalBase& s, const std::string& methodName) { std::string jsFunction = "function(obj, event) {" """var o = jQuery.data(" + jsRef() + ", 'obj');" """if (o) o." + methodName + "(obj, event);" "}"; s.connect(jsFunction); }
void WGLWidget::contextRestored() { restoringContext_ = true; pImpl_->restoreContext(jsRef()); repaintGL(GLClientSideRenderer::UPDATE_GL | GLClientSideRenderer::RESIZE_GL | GLClientSideRenderer::PAINT_GL); restoringContext_ = false; }
void WAbstractSpinBox::refresh() { doJavaScript ("jQuery.data(" + jsRef() + ", 'obj')" ".setLocale(" + jsStringLiteral(WLocale::currentLocale().decimalPoint()) + "," + jsStringLiteral(WLocale::currentLocale().groupSeparator()) + ");"); WLineEdit::refresh(); }
void WLineEdit::connectJavaScript(Wt::EventSignalBase& s, const std::string& methodName) { std::string jsFunction = "function(lobj, event) {" """var o = jQuery.data(" + jsRef() + ", 'lobj');" """if (o) o." + methodName + "(lobj, event);" "}"; s.connect(jsFunction); }