import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorMap;
+import com.vaadin.client.ServerConnector;
import com.vaadin.client.renderers.Renderer;
import com.vaadin.client.renderers.WidgetRenderer;
import com.vaadin.client.ui.AbstractComponentConnector;
*/
@Connect(ComponentRenderer.class)
public class ComponentRendererConnector
- extends AbstractGridRendererConnector<String> {
+ extends AbstractGridRendererConnector<String> {
private HashSet<String> knownConnectors = new HashSet<>();
private HandlerRegistration handlerRegistration;
+ @Override
+ public void setParent(ServerConnector parent) {
+ super.setParent(parent);
+ createConnectorHierarchyChangeHandler();
+ }
+
@Override
protected Renderer<String> createRenderer() {
return new WidgetRenderer<String, SimplePanel>() {
@Override
public void render(RendererCellReference cell, String connectorId,
- SimplePanel widget) {
- createConnectorHierarchyChangeHandler();
+ SimplePanel widget) {
+ assert handlerRegistration != null : "HirarchyChangeHandler should not be null when rendering.";
Widget connectorWidget = null;
if (connectorId != null) {
ComponentConnector connector = (ComponentConnector) ConnectorMap
- .get(getConnection()).getConnector(connectorId);
+ .get(getConnection()).getConnector(connectorId);
if (connector != null) {
connectorWidget = connector.getWidget();
knownConnectors.add(connectorId);
/**
* Adds a listener for grid hierarchy changes to find detached connectors
- * previously handled by this renderer in order to detach from DOM their widgets
- * before {@link AbstractComponentConnector#onUnregister()} is invoked
- * otherwise an error message is logged.
+ * previously handled by this renderer in order to detach from DOM their
+ * widgets before {@link AbstractComponentConnector#onUnregister()} is
+ * invoked otherwise an error message is logged.
*/
private void createConnectorHierarchyChangeHandler() {
- if (handlerRegistration == null) {
- handlerRegistration = getGridConnector().addConnectorHierarchyChangeHandler(event -> {
- Iterator<String> iterator = knownConnectors.iterator();
- while (iterator.hasNext()) {
- ComponentConnector connector = (ComponentConnector) ConnectorMap.get(getConnection()).getConnector(iterator.next());
- if (connector != null && connector.getParent() == null) {
- connector.getWidget().removeFromParent();
- iterator.remove();
+ assert handlerRegistration == null : "Trying to re-initialize HierarchyChangeHandler";
+ handlerRegistration = getGridConnector()
+ .addConnectorHierarchyChangeHandler(event -> {
+ Iterator<String> iterator = knownConnectors.iterator();
+ while (iterator.hasNext()) {
+ ComponentConnector connector = (ComponentConnector) ConnectorMap
+ .get(getConnection())
+ .getConnector(iterator.next());
+ if (connector != null
+ && connector.getParent() == null) {
+ connector.getWidget().removeFromParent();
+ iterator.remove();
+ }
}
- }
- });
- }
+ });
}
private void unregisterHierarchyHandler() {
/**
* Selects the given item. If another item was already selected, that item
* is deselected.
- *
+ *
* @param item
* the item to select
*/
/**
* Selects the given item. If another item was already selected, that item
* is deselected.
- *
+ *
* @param item
* the item to select
*/
protected void setup(VaadinRequest request) {
Grid<String> grid = new Grid<>();
grid.addColumn(string -> new Label(string), new ComponentRenderer())
- .setId("label").setCaption("Column 0");
+ .setId("label").setCaption("Column 0");
grid.getDefaultHeaderRow().getCell("label")
- .setComponent(new Label("Label"));
+ .setComponent(new Label("Label"));
grid.addComponentColumn(string -> {
if (textFields.containsKey(string)) {
log("Reusing old text field for: " + string);
grid.addColumn(string -> {
Button button = new Button("Click Me!",
- event -> toggleFieldVisibility(string));
+ event -> toggleFieldVisibility(string));
button.setId(string.replace(' ', '_').toLowerCase(Locale.ROOT));
return button;
}, new ComponentRenderer()).setId("button").setCaption("Button");
grid.setRowHeight(40);
grid.getDefaultHeaderRow().join("textField", "button")
- .setText("Other Components");
+ .setText("Other Components");
addComponent(grid);
grid.setSizeFull();
grid.setItems(IntStream.range(0, 5).boxed()
- .map(i -> "Row " + (i + (counter * 1000))));
+ .map(i -> "Row " + (i + (counter * 1000))));
}
@Test
public void changingVisibilityOfComponentShouldNotThrowClientSideExceptions() {
- testHideComponent(grid -> ThreadLocalRandom.current().nextInt(1, (int) grid.getRowCount() - 1));
+ testHideComponent(grid -> ThreadLocalRandom.current().nextInt(1,
+ (int) grid.getRowCount() - 1));
}
@Test
testHideComponent(grid -> (int) grid.getRowCount() - 1);
}
- private void testHideComponent(Function<GridElement, Integer> rowUnderTestSupplier) {
+ private void testHideComponent(
+ Function<GridElement, Integer> rowUnderTestSupplier) {
openTestURL("debug");
GridElement grid = $(GridElement.class).first();
int rowUnderTest = rowUnderTestSupplier.apply(grid);
assertTrue("Text field should be visible", grid.getCell(rowUnderTest, 1)
- .isElementPresent(TextFieldElement.class));
+ .isElementPresent(TextFieldElement.class));
assertOtherConnectorsArePresent(grid, rowUnderTest);
clearDebugMessages();
clickVisibilityToggleButton(grid, rowUnderTest);
}
- private void assertOnlyTextFieldOnTestedRowIsNotPresent(GridElement grid, int rowUnderTest) {
- assertFalse("Text field should not be visible", grid.getCell(rowUnderTest, 1)
- .isElementPresent(TextFieldElement.class));
+ private void assertOnlyTextFieldOnTestedRowIsNotPresent(GridElement grid,
+ int rowUnderTest) {
+ assertFalse("Text field should not be visible",
+ grid.getCell(rowUnderTest, 1)
+ .isElementPresent(TextFieldElement.class));
assertOtherConnectorsArePresent(grid, rowUnderTest);
}
- private void assertAllTextFieldsArePresent(GridElement grid, int rowUnderTest) {
+ private void assertAllTextFieldsArePresent(GridElement grid,
+ int rowUnderTest) {
assertTrue("Text field should be visible", grid.getCell(rowUnderTest, 1)
- .isElementPresent(TextFieldElement.class));
+ .isElementPresent(TextFieldElement.class));
assertOtherConnectorsArePresent(grid, rowUnderTest);
}
private void assertNotClientSideErrors() {
assertNoErrorNotifications();
- // Should not log "Widget is still attached to the DOM ..." error message
+ // Should not log "Widget is still attached to the DOM ..." error
+ // message
assertNoDebugMessage(Level.SEVERE);
}
- private void clickVisibilityToggleButton(GridElement grid, int rowUnderTest) {
- grid.getRow(rowUnderTest).getCell(2).findElement(By.className("v-button")).click();
+ private void clickVisibilityToggleButton(GridElement grid,
+ int rowUnderTest) {
+ grid.getRow(rowUnderTest).getCell(2)
+ .findElement(By.className("v-button")).click();
}
- private void assertOtherConnectorsArePresent(GridElement grid, int rowUnderTest) {
+ private void assertOtherConnectorsArePresent(GridElement grid,
+ int rowUnderTest) {
IntStream.range(1, (int) grid.getRowCount())
- .filter(row -> row != rowUnderTest)
- .forEach(row ->
- assertTrue("Text field should be visible", grid.getCell(row, 1)
- .isElementPresent(TextFieldElement.class))
- );
+ .filter(row -> row != rowUnderTest)
+ .forEach(row -> assertTrue("Text field should be visible",
+ grid.getCell(row, 1)
+ .isElementPresent(TextFieldElement.class)));
}
}
protected void waitUntilClientCounterChanges(final int expectedValue) {
waitUntil(input -> {
- try {
- return BasicPushTest
- .getClientCounter(BasicPushTest.this) == expectedValue;
- } catch (NoSuchElementException e) {
- return false;
- }
- },
- 10);
+ try {
+ return BasicPushTest
+ .getClientCounter(BasicPushTest.this) == expectedValue;
+ } catch (NoSuchElementException e) {
+ return false;
+ }
+ }, 10);
}
protected void waitUntilServerCounterChanges() {