Auto Resizing NatTable in Eclipse RCP Application - eclipse-rcp

I am trying to auto resize my NatTable. I have few things :
1) My NatTable consists of only one column.
2) I am hiding NatTable occasionally.
3) The Part Control surrounding NatTable auto resizes on mouse drag. NatTable should also fit the size.
4) I have custom cell painters for NatTable Cells.
I tried with my bodyDataLayer(Which is based on GlazedListsDataProvider) :
bodyDataLayer.setDefaultRowHeight(35);
bodyDataLayer.setColumnWidthByPosition(0, 100);
bodyDataLayer.setColumnPercentageSizing(true);
But nattable does not show up at all. If I double click the invisible rows, I get required row. But natTable itself does not appear.
NatTable shows up only if
bodyDataLayer.setDefaultColumnWidth(SOME_VALUE);
Only default column width works.
I tried to add a Paint Listener to NatTable to initialize auto resize commands as suggested on Official Documentation. But it has no effect at all.
I tried to add
natTable.setLayerPainter(
new NatGridLayerPainter(natTable, SOME_VALUE));
with auto resizing of columns by position.But it also renders nothing. I am wondering how to resize my NatTable?

Typically DataLayer#setColumnPercentageSizing(true)should be sufficient for percentage sizing.
I can only assume that hiding NatTable occasionally has a negative effect, because that might lead to miscalculation of the percentage values. 100% of 0 is still 0.
Are you calling NatTable#setVisible(false) to hide the NatTable? In that case try to execute the following lines of code
natTable.doCommand(new ClientAreaResizeCommand(natTable));
natTable.redraw();
If that fixes your issue, please open a ticket and report that issue. In that case it seems we need to add a listener for SWT.Show or override setVisible() to execute these lines of code on visibility changes.

Related

How to edit rowSpan of cell of report in BIRT?

I created a report (.rptdesign) in eclipse/BIRT and added a Grid and some rows in it. I want to change the rowSpan of 1st cell in 1st row to 3. But in properties window, the property is 1:inherited and won't allow me to edit the value. I tried different combinations of width and height (in, %..) and other properties but can't figure out this behavior.
I spent hours and there is barely any resource available online or on official site. Any help is appreciated. Thanks.
when you create a grid with rows- all cells are equal in width. Now what you can do is merge the cells together that will create the rowspan/colspan like this -
Please click on image to see steps
After merging it will look like this -
You can get more information here : eclipse help
You just mark several cells in the layout editor, then "merge cells" in the context menu. To split a block of merged cells again, use "split cells" in the context menu.

ListGrid with auto size - missing columns

I'm using smartgwt ListGrid. The problem appears when it's empty, and if i manually set columns width, i can get some columns clipped in the view port and there is no horizontal scrolling so I can't access them.
But if I add an empty record, the scrollbar appears. I've fixed it by adding
setAutoFitData(Autofit.HORIZONTAL);
setAutoFitMaxColumns(3000);
setOverflow(Overflow.AUTO);
But I need to add some freezed columns to my listGrid. I'd like to use setFrozen(true) method, but its not compatible with setAutoFitData(Autofit.HORIZONTAL);
What I need is
to show a scrollbar if columns are out of the view port, even when list grid is empty.
some first columns must be frozen.
Everything works with the base List Grid with no additional options. But when i set
setShowEmptyMessage(false);
my scrollbar disappears.
Kind of workaround i've found:
setShowEmptyMessage(true);
setEmptyMessage(" ");

GXT add doesn't seem to work after LayoutContainer.removeAll()

GXT 2.25.
I have a screen with a layout container with a TableLayout with two columns. The left column has a tree grid. The right column is a layout container with table layout, one column.
When I click on various items on the tree grid, I want to display editable fields in the layout container on the right that match to the item clicked on.
When I first start the form and am loading the data from the server, I add text to the layout container and it seems to be fine.
After the text is loaded, I call secondLayout.removeAll() to remove all items. Then I click on an item in the tree. The selection method calls secondLayout.removeAll() and then adds a new text item "Loaded..." for testing.
private LayoutContainer secondaryLayout;
And then...
secondaryLayout.removeAll();
secondaryLayout.add(new Text("Loaded..."));
Ideas?
After making structural changes to a container, be sure to invoke (in GXT 2) the layout method to re-run the layout routines. The alternative is to configure the LayoutContainer to re-run layouts on each modification (using setLayoutOnChange), but that would in this case be at least two re-layouts - one for removeAll, and another for each new object added. Could be needlessly expensive, so better to run once and for all when you are finished making changes.
(Worth pointing out perhaps that GXT 2.2.5 is just over two years old, 2.2.6, 2.3.0 have gone out since then, and it is being superseded by GXT 3. In GXT 3, the method here would be forceLayout.)

How to have the container adjust to a GWT grid?

I have a DataGrid with a SimplePager and when theres less than the predefined number of rows per page (in this case 15) the container will show those rows and leave a white space in between the grid and the simplePager (where the other rows would be).
I have seen some mentions on other sites about rendering datagrid first and then fit it into the container, but i have no idea what this means (Or at least, i don't think they're saying its as easy as removing it from the parent and re-attaching it, since i've tried that already).
Thanks in advance.
My proposition - resize container after data fetch, after rendering of grid. It will be just something like this:
container.setHeight(grid.getOffsetHeight() + "px");

GWT 2.4 DataGrid automatic scrolling when selecting an item

I am using GWT 2.4's new DataGrid in a project. I configured the DataGrid with a pagesize of 50.
The available screen is not big enough to display all items and thus a vertical scrollbar is shown (this is actually the main purpose for using a DataGrid in the first place).
I attached a SingleSelectionModel to the DataGrid in order to be able to select items.
This works fine so far.
However I also have another widget with which the user can interact. Based on that user action a item from the DataGrid should be selected.
Sometimes the selected item is not in the visible screen region and the user has to scroll down in the DataGrid to see it.
Is there any way to automatically or manually scroll down, so that the selected item is visible?
I checked the JavaDocs of the DataGrid and found no appropriate method or function for doing that.
Don't know if this works, but you could try to get the row element for the selection and use the scrollIntoView Method.
Example Code:
dataGrid.getRowElement(INDEX_OF_SELECTED_ITEM).scrollIntoView();
The answer above works pretty well, though if the grid is wider than your window and has a horizontal scroll bar, it also scrolls all the way to the right which is pretty annoying. I was able to get it to scroll down and stay scrolled left by getting the first cell in the selected row and then having it scroll that into view.
dataGrid.getRowElement(dataGrid.getVisibleItems().indexOf(object)).getCells().getItem(0).scrollIntoView();
Don't have time to try it out, but DataGrid implements the interface HasRows, and HasRows has, among other things, a method called setVisibleRange. You just need to figure out the row number of the item that you want to focus on, and then set the visible range from that number n to n+50. That way the DataGrid will reset to put that item at the top (or near the top if it is in the last 50 elements of the list backing the DataGrid). Don't forget to redraw your DataGrid.
Have you already looked at this? If so, I'd be surprised that it didn't work.
Oh, and since this is one widget talking to another, you probably have some messaging set up and some message handlers so that when the user interacts with that second widget and "selects" the item, the message fires on the EventBus and a handler for that message fixes up the DataGrid along the lines I've described. I think you'll have to do this wiring yourself.
My solution, a little better:
dataGrid.getRow(model).scrollIntoView();
I got a Out of bounds exception doing the above.
I solved it getting the ScrollPanel in the DataGrid and used .scrollToTop() and so on on the ScrollPanel. However, to access the ScrollPanel in the DataGrid I had to use this comment:
http://code.google.com/p/google-web-toolkit/issues/detail?id=6865
As Kem pointed out, it's annoying the "scrollToRight" effect after the scrollIntoView. After me, Kem's solution gives a better behaviour than the base one as usually the first columns in a table are the more meaningful.
I improved a bit his approach, which scrolls horizontally to the first column of the row we want to be visible, by calculating the first visible column on the left before applying the scroll and then scrolling to it.
A final note: Columns absolute left is tested against "51". This is a value I found "experimentally" by looking the JS values in the browser's developer tool, I think it depends on the table's style, you may need to change/calculate it.
Below the code:
public void scrollIntoView(T next) {
int index = datagrid.getVisibleItems().indexOf(next);
NodeList<TableCellElement> cells = datagrid.getRowElement(index).getCells();
int firstVisibleIndex = -1;
for(int i=0; i<cells.getLength() && firstVisibleIndex<0;i++)
if(UIObject.isVisible(cells.getItem(i)) && (cells.getItem(i).getAbsoluteLeft() > 51) && (cells.getItem(i).getAbsoluteTop() > 0))
firstVisibleIndex = i;
cells.getItem(firstVisibleIndex>=0? firstVisibleIndex : 0).scrollIntoView();
}