您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

VScrollTablePaintable.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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.core.client.Scheduler;
  7. import com.google.gwt.dom.client.Style.Position;
  8. import com.google.gwt.user.client.Command;
  9. import com.google.gwt.user.client.ui.Widget;
  10. import com.vaadin.terminal.gwt.client.ApplicationConnection;
  11. import com.vaadin.terminal.gwt.client.BrowserInfo;
  12. import com.vaadin.terminal.gwt.client.DirectionalManagedLayout;
  13. import com.vaadin.terminal.gwt.client.UIDL;
  14. import com.vaadin.terminal.gwt.client.Util;
  15. import com.vaadin.terminal.gwt.client.ComponentConnector;
  16. public class VScrollTablePaintable extends AbstractComponentContainerConnector
  17. implements DirectionalManagedLayout {
  18. /*
  19. * (non-Javadoc)
  20. *
  21. * @see
  22. * com.vaadin.terminal.gwt.client.Paintable#updateFromUIDL(com.vaadin.terminal
  23. * .gwt.client.UIDL, com.vaadin.terminal.gwt.client.ApplicationConnection)
  24. */
  25. @Override
  26. public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
  27. getWidget().rendering = true;
  28. if (uidl.hasAttribute(VScrollTable.ATTRIBUTE_PAGEBUFFER_FIRST)) {
  29. getWidget().serverCacheFirst = uidl
  30. .getIntAttribute(VScrollTable.ATTRIBUTE_PAGEBUFFER_FIRST);
  31. getWidget().serverCacheLast = uidl
  32. .getIntAttribute(VScrollTable.ATTRIBUTE_PAGEBUFFER_LAST);
  33. } else {
  34. getWidget().serverCacheFirst = -1;
  35. getWidget().serverCacheLast = -1;
  36. }
  37. /*
  38. * We need to do this before updateComponent since updateComponent calls
  39. * this.setHeight() which will calculate a new body height depending on
  40. * the space available.
  41. */
  42. if (uidl.hasAttribute("colfooters")) {
  43. getWidget().showColFooters = uidl
  44. .getBooleanAttribute("colfooters");
  45. }
  46. getWidget().tFoot
  47. .setVisible(getWidget().showColFooters);
  48. super.updateFromUIDL(uidl, client);
  49. if (!isRealUpdate(uidl)) {
  50. getWidget().rendering = false;
  51. return;
  52. }
  53. getWidget().enabled = !getState().isDisabled();
  54. if (BrowserInfo.get().isIE8() && !getWidget().enabled) {
  55. /*
  56. * The disabled shim will not cover the table body if it is relative
  57. * in IE8. See #7324
  58. */
  59. getWidget().scrollBodyPanel.getElement().getStyle()
  60. .setPosition(Position.STATIC);
  61. } else if (BrowserInfo.get().isIE8()) {
  62. getWidget().scrollBodyPanel.getElement().getStyle()
  63. .setPosition(Position.RELATIVE);
  64. }
  65. getWidget().client = client;
  66. getWidget().paintableId = uidl.getStringAttribute("id");
  67. getWidget().immediate = getState().isImmediate();
  68. int previousTotalRows = getWidget().totalRows;
  69. getWidget().updateTotalRows(uidl);
  70. boolean totalRowsChanged = (getWidget().totalRows != previousTotalRows);
  71. getWidget().updateDragMode(uidl);
  72. getWidget().updateSelectionProperties(uidl, getState());
  73. if (uidl.hasAttribute("alb")) {
  74. getWidget().bodyActionKeys = uidl
  75. .getStringArrayAttribute("alb");
  76. } else {
  77. // Need to clear the actions if the action handlers have been
  78. // removed
  79. getWidget().bodyActionKeys = null;
  80. }
  81. getWidget().setCacheRateFromUIDL(uidl);
  82. getWidget().recalcWidths = uidl
  83. .hasAttribute("recalcWidths");
  84. if (getWidget().recalcWidths) {
  85. getWidget().tHead.clear();
  86. getWidget().tFoot.clear();
  87. }
  88. getWidget().updatePageLength(uidl);
  89. getWidget().updateFirstVisibleAndScrollIfNeeded(uidl);
  90. getWidget().showRowHeaders = uidl
  91. .getBooleanAttribute("rowheaders");
  92. getWidget().showColHeaders = uidl
  93. .getBooleanAttribute("colheaders");
  94. getWidget().updateSortingProperties(uidl);
  95. boolean keyboardSelectionOverRowFetchInProgress = getWidget()
  96. .selectSelectedRows(uidl);
  97. getWidget().updateActionMap(uidl);
  98. getWidget().updateColumnProperties(uidl);
  99. UIDL ac = uidl.getChildByTagName("-ac");
  100. if (ac == null) {
  101. if (getWidget().dropHandler != null) {
  102. // remove dropHandler if not present anymore
  103. getWidget().dropHandler = null;
  104. }
  105. } else {
  106. if (getWidget().dropHandler == null) {
  107. getWidget().dropHandler = getWidget().new VScrollTableDropHandler();
  108. }
  109. getWidget().dropHandler.updateAcceptRules(ac);
  110. }
  111. UIDL partialRowAdditions = uidl.getChildByTagName("prows");
  112. UIDL partialRowUpdates = uidl.getChildByTagName("urows");
  113. if (partialRowUpdates != null || partialRowAdditions != null) {
  114. // we may have pending cache row fetch, cancel it. See #2136
  115. getWidget().rowRequestHandler.cancel();
  116. getWidget().updateRowsInBody(partialRowUpdates);
  117. getWidget().addAndRemoveRows(partialRowAdditions);
  118. } else {
  119. UIDL rowData = uidl.getChildByTagName("rows");
  120. if (rowData != null) {
  121. // we may have pending cache row fetch, cancel it. See #2136
  122. getWidget().rowRequestHandler.cancel();
  123. if (!getWidget().recalcWidths
  124. && getWidget().initializedAndAttached) {
  125. getWidget().updateBody(rowData,
  126. uidl.getIntAttribute("firstrow"),
  127. uidl.getIntAttribute("rows"));
  128. if (getWidget().headerChangedDuringUpdate) {
  129. getWidget().triggerLazyColumnAdjustment(
  130. true);
  131. } else if (!getWidget()
  132. .isScrollPositionVisible()
  133. || totalRowsChanged
  134. || getWidget().lastRenderedHeight != getWidget().scrollBody
  135. .getOffsetHeight()) {
  136. // webkits may still bug with their disturbing scrollbar
  137. // bug, see #3457
  138. // Run overflow fix for the scrollable area
  139. // #6698 - If there's a scroll going on, don't abort it
  140. // by changing overflows as the length of the contents
  141. // *shouldn't* have changed (unless the number of rows
  142. // or the height of the widget has also changed)
  143. Scheduler.get().scheduleDeferred(new Command() {
  144. public void execute() {
  145. Util.runWebkitOverflowAutoFix(getWidget().scrollBodyPanel
  146. .getElement());
  147. }
  148. });
  149. }
  150. } else {
  151. getWidget().initializeRows(uidl, rowData);
  152. }
  153. }
  154. }
  155. if (!getWidget().isSelectable()) {
  156. getWidget().scrollBody
  157. .addStyleName(VScrollTable.CLASSNAME + "-body-noselection");
  158. } else {
  159. getWidget().scrollBody
  160. .removeStyleName(VScrollTable.CLASSNAME
  161. + "-body-noselection");
  162. }
  163. getWidget().hideScrollPositionAnnotation();
  164. getWidget().purgeUnregistryBag();
  165. // selection is no in sync with server, avoid excessive server visits by
  166. // clearing to flag used during the normal operation
  167. if (!keyboardSelectionOverRowFetchInProgress) {
  168. getWidget().selectionChanged = false;
  169. }
  170. /*
  171. * This is called when the Home or page up button has been pressed in
  172. * selectable mode and the next selected row was not yet rendered in the
  173. * client
  174. */
  175. if (getWidget().selectFirstItemInNextRender
  176. || getWidget().focusFirstItemInNextRender) {
  177. getWidget().selectFirstRenderedRowInViewPort(
  178. getWidget().focusFirstItemInNextRender);
  179. getWidget().selectFirstItemInNextRender = getWidget().focusFirstItemInNextRender = false;
  180. }
  181. /*
  182. * This is called when the page down or end button has been pressed in
  183. * selectable mode and the next selected row was not yet rendered in the
  184. * client
  185. */
  186. if (getWidget().selectLastItemInNextRender
  187. || getWidget().focusLastItemInNextRender) {
  188. getWidget().selectLastRenderedRowInViewPort(
  189. getWidget().focusLastItemInNextRender);
  190. getWidget().selectLastItemInNextRender = getWidget().focusLastItemInNextRender = false;
  191. }
  192. getWidget().multiselectPending = false;
  193. if (getWidget().focusedRow != null) {
  194. if (!getWidget().focusedRow.isAttached()
  195. && !getWidget().rowRequestHandler.isRunning()) {
  196. // focused row has been orphaned, can't focus
  197. getWidget().focusRowFromBody();
  198. }
  199. }
  200. getWidget().tabIndex = uidl.hasAttribute("tabindex") ? uidl
  201. .getIntAttribute("tabindex") : 0;
  202. getWidget().setProperTabIndex();
  203. getWidget().resizeSortedColumnForSortIndicator();
  204. // Remember this to detect situations where overflow hack might be
  205. // needed during scrolling
  206. getWidget().lastRenderedHeight = getWidget().scrollBody
  207. .getOffsetHeight();
  208. getWidget().rendering = false;
  209. getWidget().headerChangedDuringUpdate = false;
  210. }
  211. @Override
  212. protected Widget createWidget() {
  213. return GWT.create(VScrollTable.class);
  214. }
  215. @Override
  216. public VScrollTable getWidget() {
  217. return (VScrollTable) super.getWidget();
  218. }
  219. public void updateCaption(ComponentConnector component, UIDL uidl) {
  220. // NOP, not rendered
  221. }
  222. public void layoutVertically() {
  223. getWidget().updateHeight();
  224. }
  225. public void layoutHorizontally() {
  226. getWidget().updateWidth();
  227. }
  228. }