void WCssTheme::applyValidationStyle(WWidget *widget, const Wt::WValidator::Result& validation, WFlags<ValidationStyleFlag> styles) const { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/CssThemeValidate.js", "validate", wtjs1); LOAD_JAVASCRIPT(app, "js/CssThemeValidate.js", "setValidationState", wtjs2); if (app->environment().ajax()) { WStringStream js; js << WT_CLASS ".setValidationState(" << widget->jsRef() << "," << (validation.state() == WValidator::Valid ? 1 : 0) << "," << validation.message().jsStringLiteral() << "," << styles.value() << ");"; widget->doJavaScript(js.str()); } else { bool validStyle = (validation.state() == WValidator::Valid) && (styles & ValidationValidStyle); bool invalidStyle = (validation.state() != WValidator::Valid) && (styles & ValidationInvalidStyle); widget->toggleStyleClass("Wt-valid", validStyle); widget->toggleStyleClass("Wt-invalid", invalidStyle); } }
void WPaintedWidget::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WPaintedWidget.js", "gfxUtils", wtjs2); LOAD_JAVASCRIPT(app, "js/WPaintedWidget.js", "WPaintedWidget", wtjs1); }
StdGridLayoutImpl2::StdGridLayoutImpl2(WLayout *layout, Impl::Grid& grid) : StdLayoutImpl(layout), grid_(grid), needAdjust_(false), needRemeasure_(false), needConfigUpdate_(false) { const char *THIS_JS = "js/StdGridLayoutImpl2.js"; WApplication *app = WApplication::instance(); if (!app->javaScriptLoaded(THIS_JS)) { app->styleSheet().addRule("table.Wt-hcenter", "margin: 0px auto;" "position: relative"); LOAD_JAVASCRIPT(app, THIS_JS, "StdLayout2", wtjs1); LOAD_JAVASCRIPT(app, THIS_JS, "layouts2", appjs1); app->doJavaScript(app->javaScriptClass() + ".layouts2.scheduleAdjust();"); app->doJavaScript("$(window).load(function() { " + app->javaScriptClass() + ".layouts2.scheduleAdjust();" + "});"); WApplication::instance()->addAutoJavaScript (app->javaScriptClass() + ".layouts2.adjustNow();"); } }
void WGLWidget::defineJavaScript() { WApplication *app = WApplication::instance(); if (renderOptions_.test(GLRenderOption::ClientSide) && WApplication::instance()->environment().webGL()) { LOAD_JAVASCRIPT(app, "js/WPaintedWidget.js", "gfxUtils", wtjs11); } LOAD_JAVASCRIPT(app, "js/WtGlMatrix.js", "glMatrix", wtjs2); LOAD_JAVASCRIPT(app, "js/WGLWidget.js", "WGLWidget", wtjs1); }
void WSuggestionPopup::defineJavaScript() { WApplication *app = WApplication::instance(); const char *THIS_JS = "js/WSuggestionPopup.js"; LOAD_JAVASCRIPT(app, THIS_JS, "WSuggestionPopup", wtjs1); LOAD_JAVASCRIPT(app, THIS_JS, "WSuggestionPopupStdMatcher", wtjs2); doJavaScript("new " WT_CLASS ".WSuggestionPopup(" + app->javaScriptClass() + "," + jsRef() + "," + replacerJS_ + "," + matcherJS_ + "," + boost::lexical_cast<std::string>(filterLength_) + "," + boost::lexical_cast<std::string>(defaultValue_) + "," + (global_ ? "true" : "false") + ");"); }
const char *StdWidgetItemImpl::secondGetPSJS() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WtResize.js", "LastGetPS", wtjs13); return WT_CLASS ".LastGetPS"; }
void WTextEdit::initTinyMCE() { const char *THIS_JS = "js/WTextEdit.js"; WApplication *app = WApplication::instance(); if (!app->javaScriptLoaded(THIS_JS)) { if (app->environment().ajax()) app->doJavaScript("window.tinyMCE_GZ = { loaded: true };", false); int version = getTinyMCEVersion(); std::string folder = version == 3 ? "tiny_mce/" : "tinymce/"; std::string jsFile = version == 3 ? "tiny_mce.js" : "tinymce.js"; std::string tinyMCEBaseURL = WApplication::relativeResourcesUrl() + folder; WApplication::readConfigurationProperty("tinyMCEBaseURL", tinyMCEBaseURL); if (!tinyMCEBaseURL.empty() && tinyMCEBaseURL[tinyMCEBaseURL.length()-1] != '/') tinyMCEBaseURL += '/'; app->require(tinyMCEBaseURL + jsFile, "window['tinyMCE']"); app->styleSheet().addRule(".mceEditor", "display: block; position: absolute;"); LOAD_JAVASCRIPT(app, THIS_JS, "WTextEdit", wtjs1); } }
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 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"); } } }
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"); }
const char *StdWidgetItemImpl::childrenGetPSJS() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WtResize.js", "ChildrenGetPS", wtjs11); return WT_CLASS ".ChildrenGetPS"; }
void WSuggestionPopup::defineJavaScript() { WApplication *app = WApplication::instance(); const char *THIS_JS = "js/WSuggestionPopup.js"; LOAD_JAVASCRIPT(app, THIS_JS, "WSuggestionPopup", wtjs1); LOAD_JAVASCRIPT(app, THIS_JS, "WSuggestionPopupStdMatcher", wtjs2); setJavaScriptMember(" WSuggestionPopup", "new " WT_CLASS ".WSuggestionPopup(" + app->javaScriptClass() + "," + jsRef() + "," + replacerJS_ + "," + matcherJS_ + "," + boost::lexical_cast<std::string> (std::max(0, filterLength_)) + "," + boost::lexical_cast<std::string>(partialResults()) + "," + boost::lexical_cast<std::string>(defaultValue_) + ");"); }
void WTreeTable::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WTreeTable.js", "WTreeTable", wtjs1); setJavaScriptMember(" WTreeTable", "new " WT_CLASS ".WTreeTable(" + app->javaScriptClass() + "," + jsRef() + ");"); }
bool WStackedWidget::loadAnimateJS() { WApplication *app = WApplication::instance(); if (app->environment().supportsCss3Animations()) { LOAD_JAVASCRIPT(app, "js/WStackedWidget.js", "WStackedWidget", wtjs1); return true; } else return false; }
void WImage::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WImage.js", "WImage", wtjs1); WStringStream ss; ss << "new " WT_CLASS ".WImage(" << app->javaScriptClass() << "," << jsRef() << "," << targetJS_ << ");"; doJavaScript(ss.str()); }
FlexLayoutImpl::FlexLayoutImpl(WLayout *layout, Impl::Grid& grid) : StdLayoutImpl(layout), grid_(grid) { const char *THIS_JS = "js/FlexLayoutImpl.js"; WApplication *app = WApplication::instance(); if (!app->javaScriptLoaded(THIS_JS)) { LOAD_JAVASCRIPT(app, THIS_JS, "FlexLayout", wtjs1); } }
void WStackedWidget::loadAnimateJS() { if (!loadAnimateJS_) { loadAnimateJS_ = true; if (javaScriptDefined_) { LOAD_JAVASCRIPT(WApplication::instance(), "js/WStackedWidget.js", "WStackedWidget.prototype.animateChild", wtjs2); setJavaScriptMember("wtAnimateChild", "$('#" + id() + "').data('obj').animateChild"); setJavaScriptMember("wtAutoReverse", autoReverseAnimation_ ? "true" : "false"); } } }
void AuthModel::configureThrottling(WInteractWidget *button) { if (passwordAuth() && passwordAuth()->attemptThrottlingEnabled()) { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/AuthModel.js", "AuthThrottle", wtjs1); button->setJavaScriptMember(" AuthThrottle", "new " WT_CLASS ".AuthThrottle(" WT_CLASS "," + button->jsRef() + "," + WString::tr("Wt.Auth.throttle-retry") .jsStringLiteral() + ");"); } }
void WPopupWidget::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WPopupWidget.js", "WPopupWidget", wtjs1); WStringStream jsObj; jsObj << "new " WT_CLASS ".WPopupWidget(" << app->javaScriptClass() << ',' << jsRef() << ',' << transient_ << ',' << autoHideDelay_ << ',' << !isHidden() << ");"; setJavaScriptMember(" WPopupWidget", jsObj.str()); }
void WAbstractSpinBox::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WSpinBox.js", "WSpinBox", wtjs1); std::string jsObj = "new " WT_CLASS ".WSpinBox(" + app->javaScriptClass() + "," + jsRef() + "," + boost::lexical_cast<std::string>(decimals()) + "," + prefix().jsStringLiteral() + "," + suffix().jsStringLiteral() + "," + jsMinMaxStep() + ");"; setJavaScriptMember("_a", "0;" + jsObj); }
WMediaPlayer::WMediaPlayer(MediaType mediaType, WContainerWidget *parent) : WCompositeWidget(parent), mediaType_(mediaType), videoWidth_(0), videoHeight_(0), gui_(this), boundSignals_(0) { for (unsigned i = 0; i < 11; ++i) control_[i] = 0; for (unsigned i = 0; i < 3; ++i) display_[i] = 0; for (unsigned i = 0; i < 2; ++i) progressBar_[i] = 0; WTemplate *impl = new WMediaPlayerImpl(this, tr("Wt.WMediaPlayer.template")); impl->bindString("gui", std::string()); setImplementation(impl); WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WMediaPlayer.js", "WMediaPlayer", wtjs1); std::string res = WApplication::relativeResourcesUrl() + "jPlayer/"; if (!app->environment().ajax()) app->require(res + "jquery.min.js"); if (app->require(res + "jquery.jplayer.min.js")) app->useStyleSheet(res + "skin/jplayer.blue.monday.css"); if (mediaType_ == Video) setVideoSize(480, 270); #ifndef WT_TARGET_JAVA implementJavaScript(&WMediaPlayer::play, jsPlayerRef() + ".jPlayer('play');"); implementJavaScript(&WMediaPlayer::pause, jsPlayerRef() + ".jPlayer('pause');"); implementJavaScript(&WMediaPlayer::stop, jsPlayerRef() + ".jPlayer('stop');"); #endif }
void WFormWidget::defineJavaScript(bool force) { if (force || !flags_.test(BIT_JS_OBJECT)) { flags_.set(BIT_JS_OBJECT); if (!isRendered()) return; WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WFormWidget.js", "WFormWidget", wtjs1); doJavaScript("new " WT_CLASS ".WFormWidget(" + app->javaScriptClass() + "," + jsRef() + "," + emptyText_.jsStringLiteral() + ");"); } }
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 WPopupMenu::prepareRender(WApplication *app) { if (!cancel_.isConnected()) { LOAD_JAVASCRIPT(app, "js/WPopupMenu.js", "WPopupMenu", wtjs1); WStringStream s; s << "new " WT_CLASS ".WPopupMenu(" << app->javaScriptClass() << ',' << jsRef() << ',' << autoHideDelay_ << ");"; setJavaScriptMember(" WPopupMenu", s.str()); cancel_.connect(this, &WPopupMenu::cancel); connectSignals(this); } adjustPadding(); }
void WDateEdit::defineJavaScript() { WApplication *app = WApplication::instance(); LOAD_JAVASCRIPT(app, "js/WDateEdit.js", "WDateEdit", wtjs1); std::string jsObj = "new " WT_CLASS ".WDateEdit(" + app->javaScriptClass() + "," + jsRef() + "," + popup_->jsRef() + ");"; setJavaScriptMember(" WDateEdit", jsObj); #ifdef WT_CNOR EventSignalBase& b = mouseMoved(); EventSignalBase& c = keyWentDown(); #endif connectJavaScript(mouseMoved(), "mouseMove"); connectJavaScript(mouseWentUp(), "mouseUp"); connectJavaScript(mouseWentDown(), "mouseDown"); connectJavaScript(mouseWentOut(), "mouseOut"); }
void Resizable::loadJavaScript(WApplication *app) { LOAD_JAVASCRIPT(app, "js/Resizable.js", "Resizable", wtjs1); }
void WDialog::create() { closeIcon_ = 0; footer_ = 0; modal_ = true; resizable_ = false; recursiveEventLoop_ = false; impl_ = dynamic_cast<WTemplate *>(implementation()); const char *CSS_RULES_NAME = "Wt::WDialog"; WApplication *app = WApplication::instance(); if (!app->styleSheet().isDefined(CSS_RULES_NAME)) { /* Needed for the dialog cover */ if (app->environment().agentIsIElt(9)) app->styleSheet().addRule("body", "height: 100%;"); std::string position = app->environment().agent() == WEnvironment::IE6 ? "absolute" : "fixed"; // we use left: 50%, top: 50%, margin hack when JavaScript is not available // see below for an IE workaround app->styleSheet().addRule("div.Wt-dialog", std::string() + (app->environment().ajax() ? "visibility: hidden;" : "") //"position: " + position + ';' + (!app->environment().ajax() ? "left: 50%; top: 50%;" "margin-left: -100px; margin-top: -50px;" : "left: 0px; top: 0px;"), CSS_RULES_NAME); if (app->environment().agent() == WEnvironment::IE6) { app->styleSheet().addRule ("div.Wt-dialogcover", "position: absolute;" "left: expression(" "(ignoreMe2 = document.documentElement.scrollLeft) + 'px' );" "top: expression(" "(ignoreMe = document.documentElement.scrollTop) + 'px' );"); // simulate position: fixed left: 50%; top 50% if (!app->environment().ajax()) app->styleSheet().addRule ("div.Wt-dialog", "position: absolute;" "left: expression(" "(ignoreMe2 = document.documentElement.scrollLeft + " "document.documentElement.clientWidth/2) + 'px' );" "top: expression(" "(ignoreMe = document.documentElement.scrollTop + " "document.documentElement.clientHeight/2) + 'px' );"); } } LOAD_JAVASCRIPT(app, "js/WDialog.js", "WDialog", wtjs1); WContainerWidget *layoutContainer = new WContainerWidget(); layoutContainer->setStyleClass("dialog-layout"); WVBoxLayout *layout = new WVBoxLayout(layoutContainer); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); impl_->bindWidget("layout", layoutContainer); titleBar_ = new WContainerWidget(); app->theme()->apply(this, titleBar_, DialogTitleBarRole); caption_ = new WText(titleBar_); caption_->setInline(false); contents_ = new WContainerWidget(); app->theme()->apply(this, contents_, DialogBodyRole); layout->addWidget(titleBar_); layout->addWidget(contents_, 1); saveCoverState(app, app->dialogCover()); /* * Cannot be done using the CSS stylesheet in case there are * contained elements with setHideWithOffsets() set * * For IE, we cannot set it yet since it will confuse width measurements * to become minimum size instead of (unconstrained) preferred size */ if (app->environment().ajax()) { setAttributeValue("style", "visibility: hidden"); /* * This is needed for animations only, but setting absolute or * fixed positioning confuses layout measurement in IE browsers */ if (!app->environment().agentIsIElt(9)) setPositionScheme(Fixed); } else setPositionScheme(app->environment().agent() == WEnvironment::IE6 ? Absolute : Fixed); }
void WMatchValidator::loadJavaScript(WApplication *app) { LOAD_JAVASCRIPT(app, "js/WMatchValidator.js", "WMatchValidator", wtjs1); }
void PopupWindow::loadJavaScript(WApplication *app) { LOAD_JAVASCRIPT(app, "js/PopupWindow.js", "PopupWindow", wtjs1); }