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.

FormConnector.java 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client.ui;
  5. import com.google.gwt.core.client.GWT;
  6. import com.google.gwt.dom.client.Style.Unit;
  7. import com.google.gwt.event.dom.client.KeyDownEvent;
  8. import com.google.gwt.user.client.ui.Widget;
  9. import com.vaadin.terminal.gwt.client.ApplicationConnection;
  10. import com.vaadin.terminal.gwt.client.ComponentConnector;
  11. import com.vaadin.terminal.gwt.client.ConnectorMap;
  12. import com.vaadin.terminal.gwt.client.UIDL;
  13. public class FormConnector extends AbstractComponentContainerConnector
  14. implements SimpleManagedLayout {
  15. @Override
  16. public void init() {
  17. VForm form = getWidget();
  18. getLayoutManager().registerDependency(this, form.footerContainer);
  19. }
  20. @Override
  21. protected boolean delegateCaptionHandling() {
  22. return false;
  23. }
  24. @Override
  25. public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
  26. getWidget().client = client;
  27. getWidget().id = uidl.getId();
  28. super.updateFromUIDL(uidl, client);
  29. if (!isRealUpdate(uidl)) {
  30. return;
  31. }
  32. boolean legendEmpty = true;
  33. if (getState().getCaption() != null) {
  34. getWidget().caption.setInnerText(getState().getCaption());
  35. legendEmpty = false;
  36. } else {
  37. getWidget().caption.setInnerText("");
  38. }
  39. if (uidl.hasAttribute(ATTRIBUTE_ICON)) {
  40. if (getWidget().icon == null) {
  41. getWidget().icon = new Icon(client);
  42. getWidget().legend.insertFirst(getWidget().icon.getElement());
  43. }
  44. getWidget().icon.setUri(uidl.getStringAttribute(ATTRIBUTE_ICON));
  45. legendEmpty = false;
  46. } else {
  47. if (getWidget().icon != null) {
  48. getWidget().legend.removeChild(getWidget().icon.getElement());
  49. }
  50. }
  51. if (legendEmpty) {
  52. getWidget().addStyleDependentName("nocaption");
  53. } else {
  54. getWidget().removeStyleDependentName("nocaption");
  55. }
  56. if (uidl.hasAttribute("error")) {
  57. final UIDL errorUidl = uidl.getErrors();
  58. getWidget().errorMessage.updateFromUIDL(errorUidl);
  59. getWidget().errorMessage.setVisible(true);
  60. } else {
  61. getWidget().errorMessage.setVisible(false);
  62. }
  63. if (getState().hasDescription()) {
  64. getWidget().desc.setInnerHTML(getState().getDescription());
  65. if (getWidget().desc.getParentElement() == null) {
  66. getWidget().fieldSet.insertAfter(getWidget().desc,
  67. getWidget().legend);
  68. }
  69. } else {
  70. getWidget().desc.setInnerHTML("");
  71. if (getWidget().desc.getParentElement() != null) {
  72. getWidget().fieldSet.removeChild(getWidget().desc);
  73. }
  74. }
  75. // first render footer so it will be easier to handle relative height of
  76. // main layout
  77. if (uidl.getChildCount() > 1
  78. && !uidl.getChildUIDL(1).getTag().equals("actions")) {
  79. // render footer
  80. ComponentConnector newFooter = client.getPaintable(uidl
  81. .getChildUIDL(1));
  82. Widget newFooterWidget = newFooter.getWidget();
  83. if (getWidget().footer == null) {
  84. getWidget().add(newFooter.getWidget(),
  85. getWidget().footerContainer);
  86. getWidget().footer = newFooterWidget;
  87. } else if (newFooter != getWidget().footer) {
  88. getWidget().remove(getWidget().footer);
  89. client.unregisterPaintable(ConnectorMap.get(getConnection())
  90. .getConnector(getWidget().footer));
  91. getWidget().add(newFooter.getWidget(),
  92. getWidget().footerContainer);
  93. }
  94. getWidget().footer = newFooterWidget;
  95. newFooter.updateFromUIDL(uidl.getChildUIDL(1), client);
  96. } else {
  97. if (getWidget().footer != null) {
  98. getWidget().remove(getWidget().footer);
  99. client.unregisterPaintable(ConnectorMap.get(getConnection())
  100. .getConnector(getWidget().footer));
  101. }
  102. }
  103. final UIDL layoutUidl = uidl.getChildUIDL(0);
  104. ComponentConnector newLayout = client.getPaintable(layoutUidl);
  105. Widget newLayoutWidget = newLayout.getWidget();
  106. if (getWidget().lo == null) {
  107. // Layout not rendered before
  108. getWidget().lo = newLayoutWidget;
  109. getWidget().add(newLayoutWidget, getWidget().fieldContainer);
  110. } else if (getWidget().lo != newLayoutWidget) {
  111. // Layout has changed
  112. client.unregisterPaintable(ConnectorMap.get(getConnection())
  113. .getConnector(getWidget().lo));
  114. getWidget().remove(getWidget().lo);
  115. getWidget().lo = newLayoutWidget;
  116. getWidget().add(newLayoutWidget, getWidget().fieldContainer);
  117. }
  118. newLayout.updateFromUIDL(layoutUidl, client);
  119. // also recalculates size of the footer if undefined size form - see
  120. // #3710
  121. client.runDescendentsLayout(getWidget());
  122. // We may have actions attached
  123. if (uidl.getChildCount() > 1) {
  124. UIDL childUidl = uidl.getChildByTagName("actions");
  125. if (childUidl != null) {
  126. if (getWidget().shortcutHandler == null) {
  127. getWidget().shortcutHandler = new ShortcutActionHandler(
  128. getId(), client);
  129. getWidget().keyDownRegistration = getWidget()
  130. .addDomHandler(getWidget(), KeyDownEvent.getType());
  131. }
  132. getWidget().shortcutHandler.updateActionMap(childUidl);
  133. }
  134. } else if (getWidget().shortcutHandler != null) {
  135. getWidget().keyDownRegistration.removeHandler();
  136. getWidget().shortcutHandler = null;
  137. getWidget().keyDownRegistration = null;
  138. }
  139. }
  140. public void updateCaption(ComponentConnector component, UIDL uidl) {
  141. // NOP form don't render caption for neither field layout nor footer
  142. // layout
  143. }
  144. @Override
  145. public VForm getWidget() {
  146. return (VForm) super.getWidget();
  147. }
  148. @Override
  149. protected Widget createWidget() {
  150. return GWT.create(VForm.class);
  151. }
  152. public void layout() {
  153. VForm form = getWidget();
  154. int footerHeight = getLayoutManager().getOuterHeight(
  155. form.footerContainer);
  156. form.fieldContainer.getStyle().setPaddingBottom(footerHeight, Unit.PX);
  157. form.footerContainer.getStyle().setMarginTop(-footerHeight, Unit.PX);
  158. }
  159. }