DomElement *WFileUpload::createDomElement() { if (methodIframe_) { DomElement *form = DomElement::createNew(DomElement::FORM); form->setId(this, true); form->setAttribute("method", "post"); form->setAttribute("action", generateUrl()); form->setAttribute("enctype", "multipart/form-data"); form->setAttribute("style", "margin:0;padding:0;display:inline"); DomElement *input = DomElement::createNew(DomElement::INPUT); input->setAttribute("type", "file"); input->setAttribute("name", "data"); input->setAttribute("size", boost::lexical_cast<std::string>(textSize_)); input->setId("in" + formName()); updateSignalConnection(*input, changed, "change", true); form->addChild(input); updateDom(*form, true); return form; } else { DomElement *result = DomElement::createNew(DomElement::INPUT); result->setAttribute("type", "file"); result->setAttribute("size", boost::lexical_cast<std::string>(textSize_)); result->setId(this, true); updateSignalConnection(*result, changed, "change", true); updateDom(*result, true); return result; } }
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 WFileUpload::updateDom(DomElement& element, bool all) { bool containsProgress = progressBar_ && progressBar_->parent() == this; DomElement *inputE = 0; if (element.type() != DomElement_INPUT && flags_.test(BIT_DO_UPLOAD) && containsProgress && !progressBar_->isRendered()) element.addChild(progressBar_->createSDomElement(WApplication::instance())); // upload() + disable() does not work. -- fix after this release, // change order of javaScript_ and properties rendering in DomElement if (fileUploadTarget_ && flags_.test(BIT_DO_UPLOAD)) { element.callMethod("submit()"); flags_.reset(BIT_DO_UPLOAD); if (containsProgress) { inputE = DomElement::getForUpdate("in" + id(), DomElement_INPUT); inputE->setProperty(PropertyStyleDisplay, "none"); } } if (flags_.test(BIT_ENABLED_CHANGED)) { if (!inputE) inputE = DomElement::getForUpdate("in" + id(), DomElement_INPUT); if (isDisabled()) inputE->callMethod("disabled=true"); else inputE->callMethod("disabled=false"); flags_.reset(BIT_ENABLED_CHANGED); } EventSignal<> *change = voidEventSignal(CHANGE_SIGNAL, false); if (change && change->needsUpdate(all)) { if (!inputE) inputE = DomElement::getForUpdate("in" + id(), DomElement_INPUT); updateSignalConnection(*inputE, *change, "change", all); } if (inputE) element.addChild(inputE); WWebWidget::updateDom(element, all); }
void WInteractWidget::updateEventSignals(DomElement& element, bool all) { EventSignalList& other = eventSignals(); for (EventSignalList::iterator i = other.begin(); i != other.end(); ++i) { #ifndef WT_NO_BOOST_INTRUSIVE EventSignalBase& s = *i; #else EventSignalBase& s = **i; #endif if (s.name() == WInteractWidget::M_CLICK_SIGNAL && flags_.test(BIT_REPAINT_TO_AJAX)) element.unwrap(); updateSignalConnection(element, s, s.name(), all); } }
DomElement *WFileUpload::createDomElement(WApplication *app) { DomElement *result = DomElement::createNew(domElementType()); if (result->type() == DomElement_FORM) result->setId(id()); else result->setName(id()); EventSignal<> *change = voidEventSignal(CHANGE_SIGNAL, false); if (fileUploadTarget_) { DomElement *i = DomElement::createNew(DomElement_IFRAME); i->setProperty(PropertyClass, "Wt-resource"); i->setProperty(PropertySrc, fileUploadTarget_->url()); i->setName("if" + id()); if (app->environment().agentIsIE()) { // http://msdn.microsoft.com/en-us/library/ms536474%28v=vs.85%29.aspx // HTA's (started by mshta.exe) have a different security model than // a normal web app, and therefore a HTA browser does not allow // interaction from iframes to the parent window unless this // attribute is set. If omitted, this causes the 'uploaded()' // signal to be blocked when a Wt app is executed as a HTA. i->setAttribute("APPLICATION", "yes"); } DomElement *form = result; form->setAttribute("method", "post"); form->setAttribute("action", fileUploadTarget_->url()); form->setAttribute("enctype", "multipart/form-data"); form->setProperty(PropertyStyle, "margin:0;padding:0;display:inline"); form->setProperty(PropertyTarget, "if" + id()); /* * wrap iframe in an extra span to work around bug in IE which does * not set the name use DOM methods */ DomElement *d = DomElement::createNew(DomElement_SPAN); d->addChild(i); form->addChild(d); DomElement *input = DomElement::createNew(DomElement_INPUT); input->setAttribute("type", "file"); if (flags_.test(BIT_MULTIPLE)) input->setAttribute("multiple", "multiple"); input->setAttribute("name", "data"); input->setAttribute("size", boost::lexical_cast<std::string>(textSize_)); input->setId("in" + id()); if (!isEnabled()) input->setProperty(Wt::PropertyDisabled, "true"); if (change) updateSignalConnection(*input, *change, "change", true); form->addChild(input); } else { result->setAttribute("type", "file"); if (flags_.test(BIT_MULTIPLE)) result->setAttribute("multiple", "multiple"); result->setAttribute("size", boost::lexical_cast<std::string>(textSize_)); if (!isEnabled()) result->setProperty(Wt::PropertyDisabled, "true"); if (change) updateSignalConnection(*result, *change, "change", true); } updateDom(*result, true); flags_.reset(BIT_ENABLE_AJAX); return result; }
void WAbstractToggleButton::updateDom(DomElement& element, bool all) { WApplication *app = WApplication::instance(); const WEnvironment& env = app->environment(); DomElement *input = 0; DomElement *span = 0; DomElement *label = 0; // Already apply theme here because it may determine its organization if (all) app->theme()->apply(this, element, 1); if (element.type() == DomElement_INPUT) input = &element; else { if (all) { input = DomElement::createNew(DomElement_INPUT); input->setName("in" + id()); span = DomElement::createNew(DomElement_SPAN); span->setName("t" + id()); if (element.type() != DomElement_LABEL) { label = DomElement::createNew(DomElement_LABEL); label->setName("l" + id()); } } else { input = DomElement::getForUpdate("in" + id(), DomElement_INPUT); span = DomElement::getForUpdate("t" + id(), DomElement_SPAN); } } if (all) updateInput(*input, all); EventSignal<> *check = voidEventSignal(CHECKED_SIGNAL, false); EventSignal<> *uncheck = voidEventSignal(UNCHECKED_SIGNAL, false); EventSignal<> *change = voidEventSignal(CHANGE_SIGNAL, false); EventSignal<WMouseEvent> *click = mouseEventSignal(M_CLICK_SIGNAL, false); /* * We piggy-back the checked and uncheck signals on the change signal. * * If agent is IE, then we piggy-back the change on the clicked signal. */ bool piggyBackChangeOnClick = env.agentIsIE(); bool needUpdateChangeSignal = (change && change->needsUpdate(all)) || (check && check->needsUpdate(all)) || (uncheck && uncheck->needsUpdate(all)); bool needUpdateClickedSignal = (click && click->needsUpdate(all)) || (piggyBackChangeOnClick && needUpdateChangeSignal); WFormWidget::updateDom(*input, all); /* * Copy all properties to the exterior element, as they relate to style, * etc... We ignore here attributes (except for tooltip), * see WWebWidget: other attributes need not be moved. * * But -- bug #423, disabled and readonly are properties that should be * kept on the interior element. */ if (&element != input) { if (element.properties().find(PropertyClass) != element.properties().end()) input->addPropertyWord(PropertyClass, element.getProperty(PropertyClass)); element.setProperties(input->properties()); input->clearProperties(); std::string v = element.getProperty(Wt::PropertyDisabled); if (!v.empty()) { input->setProperty(Wt::PropertyDisabled, v); element.removeProperty(Wt::PropertyDisabled); } v = element.getProperty(Wt::PropertyReadOnly); if (!v.empty()) { input->setProperty(Wt::PropertyReadOnly, v); element.removeProperty(Wt::PropertyReadOnly); } v = input->getAttribute("title"); if (!v.empty()) element.setAttribute("title", v); } if (flags_.test(BIT_STATE_CHANGED) || all) { input->setProperty(Wt::PropertyChecked, state_ == Unchecked ? "false" : "true"); if (supportsIndeterminate(env)) input->setProperty(Wt::PropertyIndeterminate, state_ == PartiallyChecked ? "true" : "false"); else input->setProperty(Wt::PropertyStyleOpacity, state_ == PartiallyChecked ? "0.5" : ""); flags_.reset(BIT_STATE_CHANGED); } std::vector<DomElement::EventAction> changeActions; if (needUpdateChangeSignal || (piggyBackChangeOnClick && needUpdateClickedSignal) || all) { std::string dom = "o"; if (check) { if (check->isConnected()) changeActions.push_back (DomElement::EventAction(dom + ".checked", check->javaScript(), check->encodeCmd(), check->isExposedSignal())); check->updateOk(); } if (uncheck) { if (uncheck->isConnected()) changeActions.push_back (DomElement::EventAction("!" + dom + ".checked", uncheck->javaScript(), uncheck->encodeCmd(), uncheck->isExposedSignal())); uncheck->updateOk(); } if (change) { if (change->isConnected()) changeActions.push_back (DomElement::EventAction(std::string(), change->javaScript(), change->encodeCmd(), change->isExposedSignal())); change->updateOk(); } if (!piggyBackChangeOnClick) { if (!(all && changeActions.empty())) input->setEvent("change", changeActions); } } if (needUpdateClickedSignal || all) { if (piggyBackChangeOnClick) { if (click) { changeActions.push_back (DomElement::EventAction(std::string(), click->javaScript(), click->encodeCmd(), click->isExposedSignal())); click->updateOk(); } if (!(all && changeActions.empty())) input->setEvent(CLICK_SIGNAL, changeActions); } else if (click) updateSignalConnection(*input, *click, CLICK_SIGNAL, all); } if (span) { if (all || flags_.test(BIT_TEXT_CHANGED)) { span->setProperty(PropertyInnerHTML, text_.formattedText()); if(all || flags_.test(BIT_WORD_WRAP_CHANGED)) { span->setProperty(PropertyStyleWhiteSpace, flags_.test(BIT_WORD_WRAP) ? "normal" : "nowrap"); flags_.reset(BIT_WORD_WRAP_CHANGED); } flags_.reset(BIT_TEXT_CHANGED); } } if (&element != input) { if (label) { label->addChild(input); label->addChild(span); element.addChild(label); } else { element.addChild(input); element.addChild(span); } } }
void WAbstractToggleButton::updateDom(DomElement& element, bool all) { WApplication *app = WApplication::instance(); const WEnvironment& env = app->environment(); DomElement *input = 0; DomElement *span = 0; if (element.type() == DomElement_LABEL) { if (all) { input = DomElement::createNew(DomElement_INPUT); input->setName("in" + id()); span = DomElement::createNew(DomElement_SPAN); span->setName("l" + id()); } else { input = DomElement::getForUpdate("in" + id(), DomElement_INPUT); span = DomElement::getForUpdate("l" + id(), DomElement_SPAN); } } else input = &element; if (all) updateInput(*input, all); EventSignal<> *check = voidEventSignal(CHECKED_SIGNAL, false); EventSignal<> *uncheck = voidEventSignal(UNCHECKED_SIGNAL, false); EventSignal<> *change = voidEventSignal(CHANGE_SIGNAL, false); EventSignal<WMouseEvent> *click = mouseEventSignal(M_CLICK_SIGNAL, false); /* * We piggy-back the checked and uncheck signals on the change signal. * * If agent is IE, then we piggy-back the change on the clicked signal. */ bool piggyBackChangeOnClick = env.agentIsIE(); bool needUpdateChangeSignal = (change && change->needsUpdate(all)) || (check && check->needsUpdate(all)) || (uncheck && uncheck->needsUpdate(all)); bool needUpdateClickedSignal = (click && click->needsUpdate(all)) || (piggyBackChangeOnClick && needUpdateChangeSignal); WFormWidget::updateDom(*input, all); /* * Copy all properties to the exterior element, as they relate to style, * etc... We ignore here attributes, see WWebWidget: there seems not to * be attributes that sensibly need to be moved. * * But -- bug #423, disabled and readonly are properties that should be * kept on the interior element. */ if (&element != input) { element.setProperties(input->properties()); input->clearProperties(); std::string v = element.getProperty(Wt::PropertyDisabled); if (!v.empty()) { input->setProperty(Wt::PropertyDisabled, v); element.removeProperty(Wt::PropertyDisabled); } v = element.getProperty(Wt::PropertyReadOnly); if (!v.empty()) { input->setProperty(Wt::PropertyReadOnly, v); element.removeProperty(Wt::PropertyReadOnly); } } if (stateChanged_ || all) { input->setProperty(Wt::PropertyChecked, state_ == Unchecked ? "false" : "true"); if (supportsIndeterminate(env)) input->setProperty(Wt::PropertyIndeterminate, state_ == PartiallyChecked ? "true" : "false"); else input->setProperty(Wt::PropertyStyleOpacity, state_ == PartiallyChecked ? "0.5" : ""); stateChanged_ = false; } std::vector<DomElement::EventAction> changeActions; if (needUpdateChangeSignal || (piggyBackChangeOnClick && needUpdateClickedSignal) || all) { std::string dom = "o"; if (check) { if (check->isConnected()) changeActions.push_back (DomElement::EventAction(dom + ".checked", check->javaScript(), check->encodeCmd(), check->isExposedSignal())); check->updateOk(); } if (uncheck) { if (uncheck->isConnected()) changeActions.push_back (DomElement::EventAction("!" + dom + ".checked", uncheck->javaScript(), uncheck->encodeCmd(), uncheck->isExposedSignal())); uncheck->updateOk(); } if (change) { if (change->needsUpdate(all)) changeActions.push_back (DomElement::EventAction(std::string(), change->javaScript(), change->encodeCmd(), change->isExposedSignal())); change->updateOk(); } if (!piggyBackChangeOnClick) { if (!(all && changeActions.empty())) input->setEvent("change", changeActions); } } if (needUpdateClickedSignal || all) { if (piggyBackChangeOnClick) { if (click) { changeActions.push_back (DomElement::EventAction(std::string(), click->javaScript(), click->encodeCmd(), click->isExposedSignal())); click->updateOk(); } if (!(all && changeActions.empty())) input->setEvent(CLICK_SIGNAL, changeActions); } else if (click) updateSignalConnection(*input, *click, CLICK_SIGNAL, all); } if (span) { if (all || textChanged_) { span->setProperty(PropertyInnerHTML, text_.formattedText()); textChanged_ = false; } } if (&element != input) { element.addChild(input); element.addChild(span); } }
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 (flags_.test(BIT_GOT_FOCUS)) { WApplication *app = WApplication::instance(); element.callJavaScript("setTimeout(function() {" """var o = " + jsRef() + ";" """if (o) {" "" "if (!$(o).hasClass('" + app->theme()->disabledClass() + "')) {" "" "try { " "" "o.focus();" "" "} catch (e) {}" "" "}" """}" "}, " + (env.agentIsIElt(9) ? "500" : "10") + ");"); flags_.reset(BIT_GOT_FOCUS); } WInteractWidget::updateDom(element, all); if (flags_.test(BIT_VALIDATION_CHANGED)) { if (validationToolTip_.empty()) element.setAttribute("title", toolTip().toUTF8()); else element.setAttribute("title", validationToolTip_.toUTF8()); } }