You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

VEmbeddedPaintable.java 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client.ui;
  5. import java.util.Map;
  6. import com.google.gwt.core.client.GWT;
  7. import com.google.gwt.dom.client.Document;
  8. import com.google.gwt.dom.client.Node;
  9. import com.google.gwt.dom.client.NodeList;
  10. import com.google.gwt.dom.client.ObjectElement;
  11. import com.google.gwt.dom.client.Style;
  12. import com.google.gwt.event.dom.client.DomEvent.Type;
  13. import com.google.gwt.event.shared.EventHandler;
  14. import com.google.gwt.event.shared.HandlerRegistration;
  15. import com.google.gwt.user.client.DOM;
  16. import com.google.gwt.user.client.Element;
  17. import com.google.gwt.user.client.Event;
  18. import com.google.gwt.user.client.ui.Widget;
  19. import com.vaadin.terminal.gwt.client.ApplicationConnection;
  20. import com.vaadin.terminal.gwt.client.UIDL;
  21. import com.vaadin.terminal.gwt.client.VConsole;
  22. import com.vaadin.terminal.gwt.client.VTooltip;
  23. public class VEmbeddedPaintable extends VAbstractPaintableWidget {
  24. public static final String CLICK_EVENT_IDENTIFIER = "click";
  25. @Override
  26. public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
  27. super.updateFromUIDL(uidl, client);
  28. if (!isRealUpdate(uidl)) {
  29. return;
  30. }
  31. // Save details
  32. getWidgetForPaintable().client = client;
  33. boolean clearBrowserElement = true;
  34. clickEventHandler.handleEventHandlerRegistration(client);
  35. if (uidl.hasAttribute("type")) {
  36. getWidgetForPaintable().type = uidl.getStringAttribute("type");
  37. if (getWidgetForPaintable().type.equals("image")) {
  38. getWidgetForPaintable().addStyleName(
  39. VEmbedded.CLASSNAME + "-image");
  40. Element el = null;
  41. boolean created = false;
  42. NodeList<Node> nodes = getWidgetForPaintable().getElement()
  43. .getChildNodes();
  44. if (nodes != null && nodes.getLength() == 1) {
  45. Node n = nodes.getItem(0);
  46. if (n.getNodeType() == Node.ELEMENT_NODE) {
  47. Element e = (Element) n;
  48. if (e.getTagName().equals("IMG")) {
  49. el = e;
  50. }
  51. }
  52. }
  53. if (el == null) {
  54. getWidgetForPaintable().setHTML("");
  55. el = DOM.createImg();
  56. created = true;
  57. DOM.sinkEvents(el, Event.ONLOAD);
  58. }
  59. // Set attributes
  60. Style style = el.getStyle();
  61. style.setProperty("width", getState().getWidth());
  62. style.setProperty("height", getState().getHeight());
  63. DOM.setElementProperty(el, "src", getWidgetForPaintable()
  64. .getSrc(uidl, client));
  65. if (created) {
  66. // insert in dom late
  67. getWidgetForPaintable().getElement().appendChild(el);
  68. }
  69. /*
  70. * Sink tooltip events so tooltip is displayed when hovering the
  71. * image.
  72. */
  73. getWidgetForPaintable().sinkEvents(VTooltip.TOOLTIP_EVENTS);
  74. } else if (getWidgetForPaintable().type.equals("browser")) {
  75. getWidgetForPaintable().addStyleName(
  76. VEmbedded.CLASSNAME + "-browser");
  77. if (getWidgetForPaintable().browserElement == null) {
  78. getWidgetForPaintable().setHTML(
  79. "<iframe width=\"100%\" height=\"100%\" frameborder=\"0\""
  80. + " allowTransparency=\"true\" src=\"\""
  81. + " name=\"" + uidl.getId()
  82. + "\"></iframe>");
  83. getWidgetForPaintable().browserElement = DOM
  84. .getFirstChild(getWidgetForPaintable().getElement());
  85. }
  86. DOM.setElementAttribute(getWidgetForPaintable().browserElement,
  87. "src", getWidgetForPaintable().getSrc(uidl, client));
  88. clearBrowserElement = false;
  89. } else {
  90. VConsole.log("Unknown Embedded type '"
  91. + getWidgetForPaintable().type + "'");
  92. }
  93. } else if (uidl.hasAttribute("mimetype")) {
  94. final String mime = uidl.getStringAttribute("mimetype");
  95. if (mime.equals("application/x-shockwave-flash")) {
  96. // Handle embedding of Flash
  97. getWidgetForPaintable().addStyleName(
  98. VEmbedded.CLASSNAME + "-flash");
  99. getWidgetForPaintable().setHTML(
  100. getWidgetForPaintable().createFlashEmbed(uidl));
  101. } else if (mime.equals("image/svg+xml")) {
  102. getWidgetForPaintable().addStyleName(
  103. VEmbedded.CLASSNAME + "-svg");
  104. String data;
  105. Map<String, String> parameters = VEmbedded.getParameters(uidl);
  106. if (parameters.get("data") == null) {
  107. data = getWidgetForPaintable().getSrc(uidl, client);
  108. } else {
  109. data = "data:image/svg+xml," + parameters.get("data");
  110. }
  111. getWidgetForPaintable().setHTML("");
  112. ObjectElement obj = Document.get().createObjectElement();
  113. obj.setType(mime);
  114. obj.setData(data);
  115. if (getWidgetForPaintable().width != null) {
  116. obj.getStyle().setProperty("width", "100%");
  117. }
  118. if (getWidgetForPaintable().height != null) {
  119. obj.getStyle().setProperty("height", "100%");
  120. }
  121. if (uidl.hasAttribute("classid")) {
  122. obj.setAttribute("classid",
  123. uidl.getStringAttribute("classid"));
  124. }
  125. if (uidl.hasAttribute("codebase")) {
  126. obj.setAttribute("codebase",
  127. uidl.getStringAttribute("codebase"));
  128. }
  129. if (uidl.hasAttribute("codetype")) {
  130. obj.setAttribute("codetype",
  131. uidl.getStringAttribute("codetype"));
  132. }
  133. if (uidl.hasAttribute("archive")) {
  134. obj.setAttribute("archive",
  135. uidl.getStringAttribute("archive"));
  136. }
  137. if (uidl.hasAttribute("standby")) {
  138. obj.setAttribute("standby",
  139. uidl.getStringAttribute("standby"));
  140. }
  141. getWidgetForPaintable().getElement().appendChild(obj);
  142. } else {
  143. VConsole.log("Unknown Embedded mimetype '" + mime + "'");
  144. }
  145. } else {
  146. VConsole.log("Unknown Embedded; no type or mimetype attribute");
  147. }
  148. if (clearBrowserElement) {
  149. getWidgetForPaintable().browserElement = null;
  150. }
  151. }
  152. @Override
  153. protected Widget createWidget() {
  154. return GWT.create(VEmbedded.class);
  155. }
  156. @Override
  157. public VEmbedded getWidgetForPaintable() {
  158. return (VEmbedded) super.getWidgetForPaintable();
  159. }
  160. protected final ClickEventHandler clickEventHandler = new ClickEventHandler(
  161. this, CLICK_EVENT_IDENTIFIER) {
  162. @Override
  163. protected <H extends EventHandler> HandlerRegistration registerHandler(
  164. H handler, Type<H> type) {
  165. return getWidgetForPaintable().addDomHandler(handler, type);
  166. }
  167. };
  168. }