Exemple #1
0
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") << "}";
}
Exemple #2
0
void WAbstractSpinBox::refresh()
{
  doJavaScript
    ("jQuery.data(" + jsRef() + ", 'obj')"
     ".setLocale(" 
     + jsStringLiteral(WLocale::currentLocale().decimalPoint()) + ","
     + jsStringLiteral(WLocale::currentLocale().groupSeparator()) + ");");

  WLineEdit::refresh();
}
Exemple #3
0
void DateField::createConfig(std::ostream& config)
{
  if (!validator())
    config << ",format:" << jsStringLiteral(WDate::extFormat(format_), '\'');

  LineEdit::createConfig(config);
}
Exemple #4
0
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());
}
Exemple #6
0
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;
  }
}
Exemple #7
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();
}
Exemple #8
0
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;
}
Exemple #9
0
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_;
}
Exemple #10
0
void DomElement::jsStringLiteral(std::ostream& out, const std::string& s,
				 char delimiter)
{
  EscapeOStream sout(out);
  jsStringLiteral(sout, s, delimiter);
}
Exemple #11
0
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);
}