Browse Source

Add automatic recalculation of Tree width on expand/collapse (#9767)

Fixes #9628
tags/8.1.1
Teemu Suo-Anttila 7 years ago
parent
commit
5b0accf492

+ 42
- 4
server/src/main/java/com/vaadin/ui/Tree.java View File

@@ -238,6 +238,7 @@ public class Tree<T> extends Composite
private ItemCaptionGenerator<T> captionGenerator = String::valueOf;
private IconGenerator<T> iconProvider = t -> null;
private final TreeRenderer renderer;
private boolean autoRecalculateWidth = true;

/**
* Constructs a new Tree Component.
@@ -259,10 +260,18 @@ public class Tree<T> extends Composite
treeGrid.setHeightUndefined();
treeGrid.setHeightMode(HeightMode.UNDEFINED);

treeGrid.addExpandListener(e -> fireExpandEvent(e.getExpandedItem(),
e.isUserOriginated()));
treeGrid.addCollapseListener(e -> fireCollapseEvent(
e.getCollapsedItem(), e.isUserOriginated()));
treeGrid.addExpandListener(e -> {
fireExpandEvent(e.getExpandedItem(), e.isUserOriginated());
if (autoRecalculateWidth) {
treeGrid.recalculateColumnWidths();
}
});
treeGrid.addCollapseListener(e -> {
fireCollapseEvent(e.getCollapsedItem(), e.isUserOriginated());
if (autoRecalculateWidth) {
treeGrid.recalculateColumnWidths();
}
});
treeGrid.addItemClickListener(e -> fireEvent(
new ItemClick<>(this, e.getItem(), e.getMouseEventDetails())));
}
@@ -789,6 +798,35 @@ public class Tree<T> extends Composite
renderer.getState().mode = contentMode;
}

/**
* Returns the current state of automatic width recalculation.
*
* @return {@code true} if enabled; {@code false} if disabled
*
* @since 8.1.1
*/
public boolean isAutoRecalculateWidth() {
return autoRecalculateWidth;
}

/**
* Sets the automatic width recalculation on or off. This feature is on by
* default.
*
* @param autoRecalculateWidth
* {@code true} to enable recalculation; {@code false} to turn it
* off
*
* @since 8.1.1
*/
public void setAutoRecalculateWidth(boolean autoRecalculateWidth) {
this.autoRecalculateWidth = autoRecalculateWidth;

treeGrid.getColumns().get(0)
.setMinimumWidthFromContent(autoRecalculateWidth);
treeGrid.recalculateColumnWidths();
}

/**
* Adds a context click listener that gets notified when a context click
* happens.

+ 36
- 0
uitest/src/main/java/com/vaadin/tests/components/tree/TreeWideContent.java View File

@@ -0,0 +1,36 @@
package com.vaadin.tests.components.tree;

import com.vaadin.annotations.Widgetset;
import com.vaadin.data.TreeData;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Tree;

@Widgetset("com.vaadin.DefaultWidgetSet")
public class TreeWideContent extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
Tree<String> tree = new Tree<>();

tree.setWidth("150px");
tree.setHeight("100px");

TreeData<String> data = new TreeData();
data.addItem(null, "Foo");
data.addItem("Foo", "Extra long text content that should be wider"
+ " than the allocated width of the Tree.");
data.addItem(null, "Bar");
data.addItem(null, "Baz");
tree.setTreeData(data);

// Expand the wide one initially.
tree.expand("Foo");

addComponent(tree);
addComponent(new Button("Toggle auto recalc", e -> tree
.setAutoRecalculateWidth(!tree.isAutoRecalculateWidth())));
}

}

+ 48
- 0
uitest/src/test/java/com/vaadin/tests/components/tree/TreeWideContentTest.java View File

@@ -0,0 +1,48 @@
package com.vaadin.tests.components.tree;

import org.junit.Assert;
import org.junit.Test;

import com.vaadin.testbench.elements.ButtonElement;
import com.vaadin.testbench.elements.TreeElement;
import com.vaadin.testbench.elements.TreeGridElement;
import com.vaadin.tests.tb3.SingleBrowserTest;

public class TreeWideContentTest extends SingleBrowserTest {

@Test
public void testInitialSize() {
openTestURL();

TreeGridElement tree = $(TreeElement.class).first()
.wrap(TreeGridElement.class);
Assert.assertTrue("Row should be wider than tree",
tree.getTableWrapper().getSize().getWidth() < tree.getRow(0)
.getSize().getWidth());
}

@Test
public void testSizeAfterCollapse() {
openTestURL();

TreeElement tree = $(TreeElement.class).first();
tree.collapse(0);
TreeGridElement treeGrid = tree.wrap(TreeGridElement.class);
Assert.assertTrue("Row should be as wide as tree",
treeGrid.getTableWrapper().getSize().getWidth() == treeGrid
.getRow(0).getSize().getWidth());
}

@Test
public void testSizeWithAutoRecalcDisabled() {
openTestURL();
// Disable auto recalc
$(ButtonElement.class).first().click();

TreeElement tree = $(TreeElement.class).first();
TreeGridElement treeGrid = tree.wrap(TreeGridElement.class);
Assert.assertTrue("Row should be as wide as tree",
treeGrid.getTableWrapper().getSize().getWidth() == treeGrid
.getRow(0).getSize().getWidth());
}
}

Loading…
Cancel
Save