blob: 18692aecc880998b2c669431fd27dbc683f6ae80 [file] [log] [blame]
package org.tepi.filtertable.gwt.client.ui;
import org.tepi.filtertable.FilterTreeTable;
import org.tepi.filtertable.gwt.client.ui.VFilterTreeTable.PendingNavigationEvent;
import org.tepi.filtertable.gwt.client.ui.VFilterTreeTable.VTreeTableScrollBody.VTreeTableRow;
import com.google.gwt.dom.client.Element;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.TooltipInfo;
import com.vaadin.client.UIDL;
import com.vaadin.client.Util;
import com.vaadin.client.ui.FocusableScrollPanel;
import com.vaadin.client.ui.VCustomScrollTable.VScrollTableBody.VScrollTableRow;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.treetable.TreeTableConstants;
import com.vaadin.shared.ui.treetable.TreeTableState;
@SuppressWarnings({ "serial", "deprecation" })
@Connect(FilterTreeTable.class)
public class FilterTreeTableConnector extends FilterTableConnector {
@Override
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
FocusableScrollPanel widget = null;
int scrollPosition = 0;
if (getWidget().collapseRequest) {
widget = (FocusableScrollPanel) getWidget().getWidget(2);
scrollPosition = widget.getScrollPosition();
}
getWidget().animationsEnabled = uidl.getBooleanAttribute("animate");
getWidget().colIndexOfHierarchy = uidl
.hasAttribute(TreeTableConstants.ATTRIBUTE_HIERARCHY_COLUMN_INDEX) ? uidl
.getIntAttribute(TreeTableConstants.ATTRIBUTE_HIERARCHY_COLUMN_INDEX)
: 0;
int oldTotalRows = getWidget().getTotalRows();
super.updateFromUIDL(uidl, client);
// super.updateFromUIDL set rendering to false, even though we continue
// rendering here. Set it back to true.
getWidget().rendering = true;
if (getWidget().collapseRequest) {
if (getWidget().collapsedRowKey != null
&& getWidget().scrollBody != null) {
VScrollTableRow row = getWidget().getRenderedRowByKey(
getWidget().collapsedRowKey);
if (row != null) {
getWidget().setRowFocus(row);
getWidget().focus();
}
}
int scrollPosition2 = widget.getScrollPosition();
if (scrollPosition != scrollPosition2) {
widget.setScrollPosition(scrollPosition);
}
// check which rows are needed from the server and initiate a
// deferred fetch
getWidget().onScroll(null);
}
// Recalculate table size if collapse request, or if page length is zero
// (not sent by server) and row count changes (#7908).
if (getWidget().collapseRequest
|| (!uidl.hasAttribute("pagelength") && getWidget()
.getTotalRows() != oldTotalRows)) {
/*
* Ensure that possibly removed/added scrollbars are considered.
* Triggers row calculations, removes cached rows etc. Basically
* cleans up state. Be careful if touching this, you will break
* pageLength=0 if you remove this.
*/
getWidget().triggerLazyColumnAdjustment(true);
getWidget().collapseRequest = false;
}
if (uidl.hasAttribute("focusedRow")) {
String key = uidl.getStringAttribute("focusedRow");
getWidget().setRowFocus(getWidget().getRenderedRowByKey(key));
getWidget().focusParentResponsePending = false;
} else if (uidl.hasAttribute("clearFocusPending")) {
// Special case to detect a response to a focusParent request that
// does not return any focusedRow because the selected node has no
// parent
getWidget().focusParentResponsePending = false;
}
while (!getWidget().collapseRequest
&& !getWidget().focusParentResponsePending
&& !getWidget().pendingNavigationEvents.isEmpty()) {
// Keep replaying any queued events as long as we don't have any
// potential content changes pending
PendingNavigationEvent event = getWidget().pendingNavigationEvents
.removeFirst();
getWidget()
.handleNavigation(event.keycode, event.ctrl, event.shift);
}
getWidget().rendering = false;
}
@Override
public VFilterTreeTable getWidget() {
return (VFilterTreeTable) super.getWidget();
}
@Override
public TreeTableState getState() {
return (TreeTableState) super.getState();
}
@Override
public TooltipInfo getTooltipInfo(Element element) {
TooltipInfo info = null;
if (element != getWidget().getElement()) {
Object node = Util.findWidget(
(com.google.gwt.user.client.Element) element,
VTreeTableRow.class);
if (node != null) {
VTreeTableRow row = (VTreeTableRow) node;
info = row.getTooltip(element);
}
}
if (info == null) {
info = super.getTooltipInfo(element);
}
return info;
}
}