1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.vaadin.client.ui.table;
17
18 import java.util.Iterator;
19
20 import com.google.gwt.core.client.Scheduler;
21 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
22 import com.google.gwt.dom.client.Element;
23 import com.google.gwt.dom.client.Style.Position;
24 import com.google.gwt.user.client.ui.Widget;
25 import com.vaadin.client.ApplicationConnection;
26 import com.vaadin.client.BrowserInfo;
27 import com.vaadin.client.ComponentConnector;
28 import com.vaadin.client.ConnectorHierarchyChangeEvent;
29 import com.vaadin.client.DirectionalManagedLayout;
30 import com.vaadin.client.Paintable;
31 import com.vaadin.client.ServerConnector;
32 import com.vaadin.client.TooltipInfo;
33 import com.vaadin.client.UIDL;
34 import com.vaadin.client.WidgetUtil;
35 import com.vaadin.client.ui.AbstractHasComponentsConnector;
36 import com.vaadin.client.ui.PostLayoutListener;
37 import com.vaadin.client.ui.VScrollTablePatched;
38 import com.vaadin.client.ui.VScrollTablePatched.ContextMenuDetails;
39 import com.vaadin.client.ui.VScrollTablePatched.VScrollTableBody.VScrollTableRow;
40 import com.vaadin.shared.ui.Connect;
41 import com.vaadin.shared.ui.table.TableConstants;
42 import com.vaadin.shared.ui.table.TableState;
43
44
45 public class TableConnectorPatched extends AbstractHasComponentsConnector implements
46 Paintable, DirectionalManagedLayout, PostLayoutListener {
47
48 @Override
49 protected void init() {
50 super.init();
51 getWidget().init(getConnection());
52 }
53
54
55
56
57
58
59 @Override
60 public void onUnregister() {
61 super.onUnregister();
62 getWidget().onUnregister();
63 }
64
65
66
67
68
69
70
71 @Override
72 public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
73 getWidget().rendering = true;
74
75
76
77
78 ContextMenuDetails contextMenuBeforeUpdate = getWidget().contextMenu;
79
80 if (uidl.hasAttribute(TableConstants.ATTRIBUTE_PAGEBUFFER_FIRST)) {
81 getWidget().serverCacheFirst = uidl
82 .getIntAttribute(TableConstants.ATTRIBUTE_PAGEBUFFER_FIRST);
83 getWidget().serverCacheLast = uidl
84 .getIntAttribute(TableConstants.ATTRIBUTE_PAGEBUFFER_LAST);
85 } else {
86 getWidget().serverCacheFirst = -1;
87 getWidget().serverCacheLast = -1;
88 }
89
90
91
92
93
94 if (uidl.hasAttribute("colfooters")) {
95 getWidget().showColFooters = uidl.getBooleanAttribute("colfooters");
96 }
97
98 getWidget().tFoot.setVisible(getWidget().showColFooters);
99
100 if (!isRealUpdate(uidl)) {
101 getWidget().rendering = false;
102 return;
103 }
104
105 getWidget().enabled = isEnabled();
106
107 if (BrowserInfo.get().isIE8() && !getWidget().enabled) {
108
109
110
111
112 getWidget().scrollBodyPanel.getElement().getStyle()
113 .setPosition(Position.STATIC);
114 } else if (BrowserInfo.get().isIE8()) {
115 getWidget().scrollBodyPanel.getElement().getStyle()
116 .setPosition(Position.RELATIVE);
117 }
118
119 getWidget().paintableId = uidl.getStringAttribute("id");
120 getWidget().immediate = getState().immediate;
121
122 int previousTotalRows = getWidget().totalRows;
123 getWidget().updateTotalRows(uidl);
124 boolean totalRowsHaveChanged = (getWidget().totalRows != previousTotalRows);
125
126 getWidget().updateDragMode(uidl);
127
128 getWidget().updateSelectionProperties(uidl, getState(), isReadOnly());
129
130 if (uidl.hasAttribute("alb")) {
131 getWidget().bodyActionKeys = uidl.getStringArrayAttribute("alb");
132 } else {
133
134
135 getWidget().bodyActionKeys = null;
136 }
137
138 getWidget().setCacheRateFromUIDL(uidl);
139
140 getWidget().recalcWidths = uidl.hasAttribute("recalcWidths");
141 if (getWidget().recalcWidths) {
142 getWidget().tHead.clear();
143 getWidget().tFoot.clear();
144 }
145
146 getWidget().updatePageLength(uidl);
147
148
149 getWidget().updateFirstVisibleAndScrollIfNeeded(uidl);
150
151 getWidget().showRowHeaders = uidl.getBooleanAttribute("rowheaders");
152 getWidget().showColHeaders = uidl.getBooleanAttribute("colheaders");
153
154 getWidget().updateSortingProperties(uidl);
155
156 getWidget().updateActionMap(uidl);
157
158 getWidget().updateColumnProperties(uidl);
159
160 UIDL ac = uidl.getChildByTagName("-ac");
161 if (ac == null) {
162 if (getWidget().dropHandler != null) {
163
164 getWidget().dropHandler = null;
165 }
166 } else {
167 if (getWidget().dropHandler == null) {
168 getWidget().dropHandler = getWidget().new VScrollTableDropHandler();
169 }
170 getWidget().dropHandler.updateAcceptRules(ac);
171 }
172
173 UIDL partialRowAdditions = uidl.getChildByTagName("prows");
174 UIDL partialRowUpdates = uidl.getChildByTagName("urows");
175 if (partialRowUpdates != null || partialRowAdditions != null) {
176 getWidget().postponeSanityCheckForLastRendered = true;
177
178 getWidget().rowRequestHandler.cancel();
179
180 getWidget().updateRowsInBody(partialRowUpdates);
181 getWidget().addAndRemoveRows(partialRowAdditions);
182
183
184
185 getWidget().scrollBody.setLastRendered(getWidget().scrollBody
186 .getLastRendered());
187 getWidget().updateMaxIndent();
188 } else {
189 getWidget().postponeSanityCheckForLastRendered = false;
190 UIDL rowData = uidl.getChildByTagName("rows");
191 if (rowData != null) {
192
193 getWidget().rowRequestHandler.cancel();
194
195 if (!getWidget().recalcWidths
196 && getWidget().initializedAndAttached) {
197 getWidget().updateBody(rowData,
198 uidl.getIntAttribute("firstrow"),
199 uidl.getIntAttribute("rows"));
200 if (getWidget().headerChangedDuringUpdate) {
201 getWidget().triggerLazyColumnAdjustment(true);
202 }
203 } else {
204 getWidget().initializeRows(uidl, rowData);
205 }
206 }
207 }
208
209 boolean keyboardSelectionOverRowFetchInProgress = getWidget()
210 .selectSelectedRows(uidl);
211
212
213
214
215 showSavedContextMenu(contextMenuBeforeUpdate);
216
217 if (!getWidget().isSelectable()) {
218 getWidget().scrollBody.addStyleName(getWidget()
219 .getStylePrimaryName() + "-body-noselection");
220 } else {
221 getWidget().scrollBody.removeStyleName(getWidget()
222 .getStylePrimaryName() + "-body-noselection");
223 }
224
225 getWidget().hideScrollPositionAnnotation();
226
227
228
229 if (!keyboardSelectionOverRowFetchInProgress) {
230 getWidget().selectionChanged = false;
231 }
232
233
234
235
236
237
238 if (getWidget().selectFirstItemInNextRender
239 || getWidget().focusFirstItemInNextRender) {
240 getWidget().selectFirstRenderedRowInViewPort(
241 getWidget().focusFirstItemInNextRender);
242 getWidget().selectFirstItemInNextRender = getWidget().focusFirstItemInNextRender = false;
243 }
244
245
246
247
248
249
250 if (getWidget().selectLastItemInNextRender
251 || getWidget().focusLastItemInNextRender) {
252 getWidget().selectLastRenderedRowInViewPort(
253 getWidget().focusLastItemInNextRender);
254 getWidget().selectLastItemInNextRender = getWidget().focusLastItemInNextRender = false;
255 }
256 getWidget().multiselectPending = false;
257
258 if (getWidget().focusedRow != null) {
259 if (!getWidget().focusedRow.isAttached()
260 && !getWidget().rowRequestHandler.isRequestHandlerRunning()) {
261
262 if (getWidget().selectedRowKeys.contains(getWidget().focusedRow
263 .getKey())) {
264
265
266 getWidget().setRowFocus(
267 getWidget().getRenderedRowByKey(
268 getWidget().focusedRow.getKey()));
269 } else if (getWidget().selectedRowKeys.size() > 0) {
270
271 getWidget().setRowFocus(
272 getWidget().getRenderedRowByKey(
273 getWidget().selectedRowKeys.iterator()
274 .next()));
275 } else {
276
277 getWidget().focusRowFromBody();
278 }
279 }
280 }
281
282
283
284
285
286
287
288
289 if (uidl.hasAttribute(TableConstants.ATTRIBUTE_KEY_MAPPER_RESET)
290 && uidl.getBooleanAttribute(TableConstants.ATTRIBUTE_KEY_MAPPER_RESET)
291 && getWidget().selectionRangeStart != null) {
292 assert !getWidget().selectionRangeStart.isAttached();
293 getWidget().selectionRangeStart = getWidget().focusedRow;
294 }
295
296 getWidget().tabIndex = getState().tabIndex;
297 getWidget().setProperTabIndex();
298
299 Scheduler.get().scheduleFinally(new ScheduledCommand() {
300
301 @Override
302 public void execute() {
303 getWidget().resizeSortedColumnForSortIndicator();
304 }
305 });
306
307
308
309 getWidget().lastRenderedHeight = getWidget().scrollBody
310 .getOffsetHeight();
311
312 getWidget().rendering = false;
313 getWidget().headerChangedDuringUpdate = false;
314
315 }
316
317 @Override
318 public VScrollTablePatched getWidget() {
319 return (VScrollTablePatched) super.getWidget();
320 }
321
322 @Override
323 public void updateCaption(ComponentConnector component) {
324
325 }
326
327 @Override
328 public void layoutVertically() {
329 getWidget().updateHeight();
330 }
331
332 @Override
333 public void layoutHorizontally() {
334 getWidget().updateWidth();
335 }
336
337 @Override
338 public void postLayout() {
339 VScrollTablePatched table = getWidget();
340 if (table.isVisibleInHierarchy() && table.sizeNeedsInit) {
341 table.sizeInit();
342 Scheduler.get().scheduleFinally(new ScheduledCommand() {
343 @Override
344 public void execute() {
345
346 WidgetUtil.forceIE8Redraw(getWidget().getElement());
347
348 getLayoutManager().setNeedsMeasure(TableConnectorPatched.this);
349 ServerConnector parent = getParent();
350 if (parent instanceof ComponentConnector) {
351 getLayoutManager().setNeedsMeasure(
352 (ComponentConnector) parent);
353 }
354 getLayoutManager().setNeedsVerticalLayout(
355 TableConnectorPatched.this);
356 getLayoutManager().layoutNow();
357 }
358 });
359 }
360 }
361
362 @Override
363 public boolean isReadOnly() {
364 return super.isReadOnly() || getState().propertyReadOnly;
365 }
366
367 @Override
368 public TableState getState() {
369 return (TableState) super.getState();
370 }
371
372
373
374
375
376
377
378 public void showSavedContextMenu(ContextMenuDetails savedContextMenu) {
379 if (isEnabled() && savedContextMenu != null) {
380 Iterator<Widget> iterator = getWidget().scrollBody.iterator();
381 while (iterator.hasNext()) {
382 Widget w = iterator.next();
383 VScrollTableRow row = (VScrollTableRow) w;
384 if (row.getKey().equals(savedContextMenu.rowKey)) {
385 row.showContextMenu(savedContextMenu.left,
386 savedContextMenu.top);
387 }
388 }
389 }
390 }
391
392 @Override
393 public TooltipInfo getTooltipInfo(Element element) {
394
395 TooltipInfo info = null;
396
397 if (element != getWidget().getElement()) {
398 Object node = WidgetUtil.findWidget(element, getWidget().scrollBody.iterator().next().getClass());
399
400 if (node != null) {
401 VScrollTableRow row = (VScrollTableRow) node;
402 info = row.getTooltip(element);
403 }
404 }
405
406 if (info == null) {
407 info = super.getTooltipInfo(element);
408 }
409
410 return info;
411 }
412
413 @Override
414 public boolean hasTooltip() {
415
416
417
418
419
420 return true;
421 }
422
423 @Override
424 public void onConnectorHierarchyChange(
425 ConnectorHierarchyChangeEvent connectorHierarchyChangeEvent) {
426
427 }
428
429 @Override
430 protected void updateComponentSize(String newWidth, String newHeight) {
431 super.updateComponentSize(newWidth, newHeight);
432
433 if("".equals(newWidth)) {
434 getWidget().updateWidth();
435 }
436 if("".equals(newHeight)) {
437 getWidget().updateHeight();
438 }
439 }
440 }