Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

VEmbeddedPaintable.java 8.2KB

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