diff options
author | Pekka Hyvönen <pekka@vaadin.com> | 2015-03-22 22:20:57 +0200 |
---|---|---|
committer | Pekka Hyvönen <pekka@vaadin.com> | 2015-03-22 22:20:57 +0200 |
commit | 16c67cfab9b3dd2dbf324caa612fa3a2d15550d0 (patch) | |
tree | 028c2f0acd484b9cd93131d5972eae8d36c580bc /client/src | |
parent | 8d5b8042358e8eea8db30a3114cd02993244abb2 (diff) | |
download | vaadin-framework-16c67cfab9b3dd2dbf324caa612fa3a2d15550d0.tar.gz vaadin-framework-16c67cfab9b3dd2dbf324caa612fa3a2d15550d0.zip |
Grid column hiding info from client to server #(17023)
Fixes mismatched client-server API regarding ColumnVisibilityChangeEvent
Adds and removes the column hiding toggle as needed when columns added / removed.
Known bug when a hidable column added, column toggle won't get the caption of column.
Change-Id: I708e19432dc822f713bf11f5b8e6eadb528a3961
Diffstat (limited to 'client/src')
3 files changed, 65 insertions, 9 deletions
diff --git a/client/src/com/vaadin/client/connectors/GridConnector.java b/client/src/com/vaadin/client/connectors/GridConnector.java index 0807690023..7c568e02e5 100644 --- a/client/src/com/vaadin/client/connectors/GridConnector.java +++ b/client/src/com/vaadin/client/connectors/GridConnector.java @@ -56,6 +56,8 @@ import com.vaadin.client.widget.grid.events.BodyClickHandler; import com.vaadin.client.widget.grid.events.BodyDoubleClickHandler; import com.vaadin.client.widget.grid.events.ColumnReorderEvent; import com.vaadin.client.widget.grid.events.ColumnReorderHandler; +import com.vaadin.client.widget.grid.events.ColumnVisibilityChangeEvent; +import com.vaadin.client.widget.grid.events.ColumnVisibilityChangeHandler; import com.vaadin.client.widget.grid.events.GridClickEvent; import com.vaadin.client.widget.grid.events.GridDoubleClickEvent; import com.vaadin.client.widget.grid.events.SelectAllEvent; @@ -388,6 +390,33 @@ public class GridConnector extends AbstractHasComponentsConnector implements } }; + private ColumnVisibilityChangeHandler<JsonObject> columnVisibilityChangeHandler = new ColumnVisibilityChangeHandler<JsonObject>() { + + @Override + public void onVisibilityChange( + ColumnVisibilityChangeEvent<JsonObject> event) { + if (!columnsUpdatedFromState) { + Column<?, JsonObject> column = event.getColumn(); + if (column instanceof CustomGridColumn) { + getRpcProxy(GridServerRpc.class).columnVisibilityChanged( + ((CustomGridColumn) column).id, column.isHidden(), + event.isUserOriginated()); + for (GridColumnState state : getState().columns) { + if (state.id.equals(((CustomGridColumn) column).id)) { + state.hidden = event.isHidden(); + break; + } + } + } else { + getLogger().warning( + "Visibility changed for a unknown column type in Grid: " + + column.toString() + ", type " + + column.getClass()); + } + } + } + }; + private static class CustomDetailsGenerator implements DetailsGenerator { private final Map<Integer, ComponentConnector> indexToDetailsMap = new HashMap<Integer, ComponentConnector>(); @@ -713,6 +742,8 @@ public class GridConnector extends AbstractHasComponentsConnector implements getWidget().setEditorHandler(new CustomEditorHandler()); getWidget().addColumnReorderHandler(columnReorderHandler); + getWidget().addColumnVisibilityChangeHandler( + columnVisibilityChangeHandler); getWidget().setDetailsGenerator(customDetailsGenerator); getLayoutManager().registerDependency(this, getWidget().getElement()); @@ -734,7 +765,7 @@ public class GridConnector extends AbstractHasComponentsConnector implements if (!columnIdToColumn.containsKey(state.id)) { addColumnFromStateChangeEvent(state); } - updateColumnFromState(columnIdToColumn.get(state.id), state); + updateColumnFromStateChangeEvent(state); } } @@ -947,7 +978,9 @@ public class GridConnector extends AbstractHasComponentsConnector implements private void updateColumnFromStateChangeEvent(GridColumnState columnState) { CustomGridColumn column = columnIdToColumn.get(columnState.id); + columnsUpdatedFromState = true; updateColumnFromState(column, columnState); + columnsUpdatedFromState = false; if (columnState.rendererConnector != column.getRendererConnector()) { throw new UnsupportedOperationException( diff --git a/client/src/com/vaadin/client/widget/grid/events/ColumnVisibilityChangeEvent.java b/client/src/com/vaadin/client/widget/grid/events/ColumnVisibilityChangeEvent.java index 10bfbfad68..4c25f7a61b 100644 --- a/client/src/com/vaadin/client/widget/grid/events/ColumnVisibilityChangeEvent.java +++ b/client/src/com/vaadin/client/widget/grid/events/ColumnVisibilityChangeEvent.java @@ -60,7 +60,7 @@ public class ColumnVisibilityChangeEvent<T> extends } /** - * Is the column hidden or visible. + * Was the column set hidden or visible. * * @return <code>true</code> if the column was hidden <code>false</code> if * it was set visible diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java index 3e201277a0..3b26c8be57 100644 --- a/client/src/com/vaadin/client/widgets/Grid.java +++ b/client/src/com/vaadin/client/widgets/Grid.java @@ -68,7 +68,6 @@ import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.ResizeComposite; import com.google.gwt.user.client.ui.ToggleButton; -import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.client.BrowserInfo; import com.vaadin.client.DeferredWorker; @@ -1926,7 +1925,8 @@ public class Grid<T> extends ResizeComposite implements */ private void setCellFocus(int rowIndex, int columnIndexDOM, RowContainer container) { - if (rowIndex == rowWithFocus && cellFocusRange.contains(columnIndexDOM) + if (rowIndex == rowWithFocus + && cellFocusRange.contains(columnIndexDOM) && container == this.containerWithFocus) { refreshRow(rowWithFocus); return; @@ -1955,10 +1955,12 @@ public class Grid<T> extends ResizeComposite implements ++i; } while (cell != null); } - int columnIndex = getColumns().indexOf(getVisibleColumn(columnIndexDOM)); + int columnIndex = getColumns().indexOf( + getVisibleColumn(columnIndexDOM)); if (columnIndex >= escalator.getColumnConfiguration() .getFrozenColumnCount()) { - escalator.scrollToColumn(columnIndexDOM, ScrollDestination.ANY, 10); + escalator.scrollToColumn(columnIndexDOM, ScrollDestination.ANY, + 10); } if (this.containerWithFocus == container) { @@ -3048,7 +3050,7 @@ public class Grid<T> extends ResizeComposite implements * UI and functionality related to hiding columns with toggles in the * sidebar. */ - private final class ColumnHider extends VerticalPanel { + private final class ColumnHider extends FlowPanel { ColumnHider() { setStyleName("column-hiding-panel"); @@ -3073,7 +3075,7 @@ public class Grid<T> extends ResizeComposite implements } private ToggleButton createToggle(final Column<?, T> column) { - ToggleButton toggle = new ToggleButton(column.headerCaption); + ToggleButton toggle = new ToggleButton(); toggle.addStyleName("column-hiding-toggle"); toggle.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @@ -3082,6 +3084,7 @@ public class Grid<T> extends ResizeComposite implements column.setHidden(!event.getValue(), true); } }); + updateColumnHidingToggleCaption(column, toggle); columnToHidingToggleMap.put(column, toggle); return toggle; } @@ -3119,7 +3122,19 @@ public class Grid<T> extends ResizeComposite implements } private void updateColumnHidingToggleCaption(Column<?, T> column) { - columnToHidingToggleMap.get(column).setText(column.headerCaption); + updateColumnHidingToggleCaption(column, + columnToHidingToggleMap.get(column)); + } + + private void updateColumnHidingToggleCaption(Column<?, T> column, + ToggleButton toggle) { + String caption = column.headerCaption; + if (caption == null || caption.isEmpty()) { + // TODO what if the content is a widget? + HeaderCell cell = getDefaultHeaderRow().getCell(column); + caption = cell.getText(); + } + toggle.setText(caption); } } @@ -5001,6 +5016,10 @@ public class Grid<T> extends ResizeComposite implements Set<String> events = new HashSet<String>(); events.addAll(getConsumedEventsForRenderer(column.getRenderer())); + if (column.isHidable()) { + columnHider.updateColumnHidable(column); + } + sinkEvents(events); } @@ -5061,6 +5080,10 @@ public class Grid<T> extends ResizeComposite implements ((Column<?, T>) column).setGrid(null); columns.remove(columnIndex); + + if (column.isHidable()) { + columnHider.updateColumnHidable(column); + } } /** |