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