PDA

View Full Version : ExtendedRowExpander



rlebosse
29 Jul 2010, 6:23 AM
Hello everybody,
I've used the ExtendedRowExpander class I found on the forum so as to make cascading grids.

I have only put only grid (sub-grid) under the main one, I have no problems, it works well.
But if I put another grid (sub-sub-grid) under the one (sub-grid) under the main one, I have some problems.

There is a "$(body)" that is not supposed to be here. I have to click on the expander to make it disappear and the sub-sub-grid appear.

I have attached an image to this message that shows my problem.

And here is the ExtendedRowExpander class code.

Do you have an idea of how I could make the "$(body)" disappear?

Thanks for your help,
Romain

public class ExtendedRowExpander extends RowExpander
{
private Widget contentWidget;
private LayoutContainer contentContainer;

public ExtendedRowExpander()
{
}

protected boolean beforeExpand(ModelData model, Element body, El row, int rowIndex)
{
RowExpanderEvent e = new RowExpanderEvent(this);
e.setModel(model);
e.setRowIndex(rowIndex);
e.setBodyElement(body);
e.setRowExpander(this);

if (fireEvent(Events.BeforeExpand, e))
{
if (contentWidget != null)
{
body.setInnerHTML(getBodyContent(model, rowIndex));
// body.setInnerHTML("");
contentContainer = new LayoutContainer();
contentContainer.add(contentWidget, new RowData(1, -1));
contentContainer.render(body);
contentContainer.layout(true);
if (!contentContainer.isAttached())
{
ComponentHelper.doAttach(contentContainer);
}
this.grid.addListener(Events.Detach, new Listener<BaseEvent>()
{
public void handleEvent(BaseEvent be)
{
if (contentContainer.isAttached())
{
ComponentHelper.doDetach(contentContainer);
}
}
});
}
return true;
}
return false;
}

public Widget getContentWidget()
{
return contentWidget;
}

public void setContentWidget(Widget contentWidget)
{
this.contentWidget = contentWidget;
}
}

sven
29 Jul 2010, 6:27 AM
Its probably the way how the RowExpander gets the body element.

Can you please post a single class testcase that implements EntryPoint? You can use inner classes.

rlebosse
29 Jul 2010, 6:28 AM
I've changed the image size. It was not possible to see anything.

rlebosse
29 Jul 2010, 6:30 AM
public class TestGrid extends Composite
{
private List<TestData> listStat;
private ListStore<TestData> statStore = new ListStore<TestData>();
private ListStore<TestData> statStore2 = new ListStore<TestData>();
private ListStore<TestData> statStore3 = new ListStore<TestData>();

private AutoHeightGrid<TestData> gStat;

@UiConstructor
public TestGrid()
{
this.gStat = makeTestGrid();

SimplePanel pan = new SimplePanel();
pan.setWidth("722");
pan.add(gStat);

initWidget(pan);
}

private AutoHeightGrid<TestData> makeTestGrid()
{
List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
ExtendedRowExpander expander = new ExtendedRowExpander();
XTemplate tpl = XTemplate.create("");
expander.setTemplate(tpl);

List<ColumnConfig> columns2 = new ArrayList<ColumnConfig>();
ExtendedRowExpander expander2 = new ExtendedRowExpander();
expander2.setTemplate(tpl);

List<ColumnConfig> columns3 = new ArrayList<ColumnConfig>();

/* id column */
ColumnConfig col3 = new ColumnConfig(TechnicalStat.FIELD_ID, "id", 200);
col3.setSortable(true);
col3.setMenuDisabled(true);
col3.setResizable(true);
columns3.add(col3);

AutoHeightGrid<TestData> grid3 = new AutoHeightGrid<TestData>(statStore3, new ColumnModel(
columns3));
grid3.setAutoWidth(true);
grid3.setAutoHeight(true);
grid3.disableTextSelection(true);
grid3.setBorders(true);
grid3.setTrackMouseOver(false);
grid3.setAutoExpandColumn("id");

statStore3.add(new TestData("Rom"));
statStore3.add(new TestData("Rama"));

expander2.setContentWidget(grid3);
columns2.add(expander2);

/* id column */
ColumnConfig col2 = new ColumnConfig(TechnicalStat.FIELD_ID, "id", 200);
col2.setSortable(true);
col2.setMenuDisabled(true);
col2.setResizable(true);
columns2.add(col2);

AutoHeightGrid<TestData> grid2 = new AutoHeightGrid<TestData>(statStore2, new ColumnModel(
columns2));
grid2.setAutoWidth(true);
grid2.setAutoHeight(true);
grid2.disableTextSelection(true);
grid2.setBorders(true);
grid2.setTrackMouseOver(false);
grid2.setAutoExpandColumn("id");
grid2.addPlugin(expander2);

statStore2.add(new TestData("Jean"));
statStore2.add(new TestData("Jacky"));

expander.setContentWidget(grid2);
columns.add(expander);

/* id column */
ColumnConfig col = new ColumnConfig(TechnicalStat.FIELD_ID, "id", 200);
col.setSortable(true);
col.setMenuDisabled(true);
col.setResizable(true);
columns.add(col);

AutoHeightGrid<TestData> grid = new AutoHeightGrid<TestData>(statStore,
new ColumnModel(columns));
grid.setAutoWidth(true);
grid.setAutoHeight(true);
grid.disableTextSelection(true);
grid.setBorders(true);
grid.setTrackMouseOver(false);
grid.setAutoExpandColumn("id");
grid.addPlugin(expander);

statStore.add(new TestData("Pierre"));
statStore.add(new TestData("Paul"));
statStore.add(new TestData("Jacques"));

return grid;
}
}

rlebosse
29 Jul 2010, 6:31 AM
sven, maybe you know where I can find a better version of what ExtendedRowExpander does?

Thanks for your help!

sven
29 Jul 2010, 6:32 AM
That is not a single class testcase. Without it, its almost impossible to help

rlebosse
29 Jul 2010, 6:35 AM
I'm sorry sven, it's part of a bigger GWT project, so I don't have a single class testcase (I don't even know how to do it ..).

Trotsky
17 Dec 2012, 8:57 AM
Has anyone found a solution to this? When using a RowExpander with a grid that has disableTextSelection(false), it will not copy the rows that are not displayed, and instead inserts this text into the clipboard: ${body}. I don't really need those expanded rows; but I don't like the ${body} tag being inserted into the copied text.

Anyone else had to deal with this?